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