为什么编译这段代码会产生错误?

4

我相信这是正确的标题:

  #include <cstdio>

请注意,上述声明与以下声明存在区别:

  #include <stdio.h>

第一个将所有内容放入"std"命名空间中,第二个则不是。因此我选择使用第一个。

以下是我在aix6.1上使用g++4.4.6编译的代码:

#include <cstdarg> //< va_list
#include <cstdio>  //< vsnprintf()
#include "virtual_utils.h"

namespace VS
{


const char* format_str( const char* str, ... ) throw()
{
  static char buf[10][1024];
  static unsigned long buf_no = 0;

  char* cur_buf = buf[ ++buf_no % 10 ];
  buf_no %= 10;

  va_list vl;
  va_start( vl, str );
#ifdef _MSC_VER
  std::_vsnprintf( cur_buf, sizeof(buf), str, vl );
#else
  std::vsnprintf( cur_buf, sizeof(buf), str, vl );
#endif

  return cur_buf;
}


} //< namespace VS

我遇到以下错误:

virtual_utils.C: In function 'const char* VS::format_str(const char*, ...)':
virtual_utils.C:28: error: 'vsnprintf' is not a member of 'std'

编辑: 将上述代码修改,移除#include "virtual_utils.h"并添加main()后,在Ideone的gcc4.3.4编译器中有警告,而在gcc4.5.1编译器下则完全没有问题。


3
你确定没有任何地方定义了"_MSC_VER"吗? - nos
1
@nos 这里应该使用 vsnprintf 而不是 _vsnprintf,而且 _MSC_VER 没有被定义在任何地方。 - crazy_prog
2
std::vsnprintf<cstdarg> 中,而不是 <cstdio> - CharlesB
3
@CharlesB: http://www.cplusplus.com/reference/clibrary/cstdarg/ 我没有找到。请再次检查。 - crazy_prog
2
这段代码在gcc4.3.4下编译通过(尽管有警告),并且在gcc4.5.1下没有警告。链接:http://ideone.com/fZ1fX 和 http://ideone.com/X23mS - razlebe
显示剩余8条评论
1个回答

1
使用--save-temps编译,并查看生成的.ii文件。这将清楚地显示每个命名空间中定义了什么,以及未定义的内容。

已知错误 -- "virtual_utils.C:28: error: 'vsnprintf' 不是 'std' 的成员。" - crazy_prog
错误已知,原因不明,解决方案未知。这将向您展示编译器所看到的内容,您可以从中学习如何处理它。 - ams
我们知道vsnprintf不是std的成员。在gcc-4.0.2 / aix上编译正常,现在我们该怎么办? - crazy_prog
这里提到 cstdio 不应该定义 vnsprintf。GCC 4.0.2 可能存在问题并已经修复,尽管我没有标准手册来确认。你可以使用 stdio.h,或者以不同的方式编写代码。 - ams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接