求助!vsnprintf函数的名字被自动替换是怎么回事

wohappy 2010-11-03 11:38:26
函数的代码是这样的
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,对这个文件单独编译是可以的。唯独在整个程序里面就不行了。
...全文
320 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
niitlcj 2013-03-12
  • 打赏
  • 举报
回复
第二次vsnprintf时, argptr这个已经变了.
FrankHB1989 2010-11-03
  • 打赏
  • 举报
回复
看来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的好好补一下语言基础吧。

赵4老师 2010-11-03
  • 打赏
  • 举报
回复
<stdio.h>
<stdarg.h>
<varargs.h>
xuwening 2010-11-03
  • 打赏
  • 举报
回复
c语言编译后的函数名都会带有下划线的,_vsnprintf提示未声明,说明你未包含该函数的头文件。
wohappy 2010-11-03
  • 打赏
  • 举报
回复
预编译的文件打印出来 vsnprintf出现的地方就如下几个
第一个是stdio.h
# 264 "/usr/include/stdio.h" 3
...
extern int vsnprintf (char *__restrict __s, size_t __maxlen,
__const char *__restrict __format, __gnuc_va_list __arg)
throw () __attribute__ ((__format__ (__printf__, 3, 0)));

第二个是cstdio
# 153 "/usr/include/c++/3.2.3/cstdio" 3
namespace __gnu_cxx
{
using ::snprintf;
using ::vfscanf;
using ::vscanf;
using ::vsnprintf;
using ::vsscanf;
}

namespace std
{
using __gnu_cxx::snprintf;
using __gnu_cxx::vfscanf;
using __gnu_cxx::vscanf;
using __gnu_cxx::vsnprintf;
using __gnu_cxx::vsscanf;
}

最后是自己写的函数
string format(const char* fmt, ...)
{
va_list argptr;
__builtin_stdarg_start((argptr),fmt);
int bufsize = _vsnprintf(0, 0, fmt, argptr) + 2;
char* buf = new char[bufsize];
_vsnprintf(buf, bufsize, fmt, argptr);
string s(buf);
delete[] buf;
__builtin_va_end(argptr);
return s;
}
goingfly 2010-11-03
  • 打赏
  • 举报
回复
研究下你的头文件 typedef
zhutianjin4355255 2010-11-03
  • 打赏
  • 举报
回复
可能哪边typedef了吧
C4Fun 2010-11-03
  • 打赏
  • 举报
回复
你是不是在你的文件里面做了新重命名,或者宏定义?也有可能是引用的,你看看预编译出来的是什么呢?

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧