首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

!vsnprintf函数的名字被自动替换是咋回事

2013-03-14 
求助!vsnprintf函数的名字被自动替换是怎么回事函数的代码是这样的string format(const char* fmt, ...){v

求助!vsnprintf函数的名字被自动替换是怎么回事
函数的代码是这样的
string format(const char* fmt, ...)
{   
va_list argptr;   
va_start(argptr, fmt);   
int bufsize = vsnprintf(NULL, 0, fmt, argptr) + 2;   
char* buf = new char[bufsize];   
vsnprintf(buf, bufsize, fmt, argptr); 
string s(buf);   
delete[] buf;       
va_end(argptr);     
return s;   
}

但是在LINUX下编译的时候 提示如下的错误
`_vsnprintf' undeclared (first use this function)

明明代码里面函数名前没有下划线的 到了make的时候就有了 

最奇怪的是我把这个函数拷贝出来到一个单独的文件里,如a.cpp,对这个文件单独编译是可以的。唯独在整个程序里面就不行了。
[解决办法]
你是不是在你的文件里面做了新重命名,或者宏定义?也有可能是引用的,你看看预编译出来的是什么呢?
[解决办法]
c语言编译后的函数名都会带有下划线的,_vsnprintf提示未声明,说明你未包含该函数的头文件。
[解决办法]
<stdio.h>
<stdarg.h>
<varargs.h>
[解决办法]
看来vsnprintf是C标准实现中的一个宏定义。
另外,正常情况下C++标准库实现(libg++为例)应该是类似这样的:
_GLIBCXX_END_NAMESPACE

#if _GLIBCXX_USE_C99

#undef snprintf
#undef vfscanf
#undef vscanf
#undef vsnprintf
#undef vsscanf

_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)

#if _GLIBCXX_USE_C99_CHECK 
[解决办法]
 _GLIBCXX_USE_C99_DYNAMIC
  extern "C" int
  (snprintf)(char * restrict, size_t, const char * restrict, ...) throw ();
  extern "C" int
  (vfscanf)(FILE * restrict, const char * restrict, __gnuc_va_list);
  extern "C" int (vscanf)(const char * restrict, __gnuc_va_list);
  extern "C" int
  (vsnprintf)(char * restrict, size_t, const char * restrict, __gnuc_va_list)
  throw ();
  extern "C" int
  (vsscanf)(const char * restrict, const char * restrict, __gnuc_va_list)
  throw ();
#endif

#if !_GLIBCXX_USE_C99_DYNAMIC
  using ::snprintf;
  using ::vfscanf;
  using ::vscanf;
  using ::vsnprintf;
  using ::vsscanf;
#endif

_GLIBCXX_END_NAMESPACE

_GLIBCXX_BEGIN_NAMESPACE(std)

  using ::__gnu_cxx::snprintf;
  using ::__gnu_cxx::vfscanf;
  using ::__gnu_cxx::vscanf;
  using ::__gnu_cxx::vsnprintf;
  using ::__gnu_cxx::vsscanf;

_GLIBCXX_END_NAMESPACE

#endif // _GLIBCXX_USE_C99
#undef以后就不当作宏了,应该不会出现这样的问题。
可能LZ的标准库实现乱掉了,C库和C++库不匹配。检查一下库配置/版本之类的。
PS.扯typedef的好好补一下语言基础吧。

热点排行