读书人

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

发布时间: 2013-03-14 10:33:15 作者: rapoo

求助!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的好好补一下语言基础吧。

读书人网 >C语言

热点推荐