snprintf和Visual Studio 2010
我不幸被一个项目用VS 2010卡住了,并且注意到下面的代码仍然不能使用不符合标准的编译器来编译:
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
char buffer[512];
snprintf(buffer, sizeof(buffer), "SomeString");
return 0;
}
(编译失败,错误:C3861:'snprintf':标识符未找到)
我记得这是VS 2005的情况,我很震惊地看到它仍然没有被修复。
是否有人知道微软是否有计划将其标准C库移植到2010年?
简短的故事:微软终于在Visual Studio 2015中实现了snprintf。在早期版本中,你可以如下模拟它。
长版本:
以下是snprintf的预期行为:
int snprintf( char* buffer, std::size_t buf_size, const char* format, ... );
最多写入buf_size - 1
字符到缓冲区。 结果字符串将以空字符结尾,除非buf_size
为零。 如果buf_size
为零,则不会写入任何内容,并且buffer
可能是空指针。 返回值是假定无限buf_size
写入的字符数,不包括终止空字符。
Visual Studio 2015之前的版本没有一致的实现。 还有一些非标准的扩展,比如_snprintf()
(它不会在溢出时写null-terminator)和_snprintf_s()
(它可以强制实现空终止,但在溢出时返回-1而不是字符数已被写入)。
建议的VS 2005及以后的回退:
#if defined(_MSC_VER) && _MSC_VER < 1900
#define snprintf c99_snprintf
#define vsnprintf c99_vsnprintf
__inline int c99_vsnprintf(char *outBuf, size_t size, const char *format, va_list ap)
{
int count = -1;
if (size != 0)
count = _vsnprintf_s(outBuf, size, _TRUNCATE, format, ap);
if (count == -1)
count = _vscprintf(format, ap);
return count;
}
__inline int c99_snprintf(char *outBuf, size_t size, const char *format, ...)
{
int count;
va_list ap;
va_start(ap, format);
count = c99_vsnprintf(outBuf, size, format, ap);
va_end(ap);
return count;
}
#endif
snprintf
不是C89的一部分。 这只是在C99标准。 微软没有支持C99的计划。
(但它也是C ++ 0x ...的标准)
有关解决方法,请参阅下面的其他答案。
如果你不需要返回值,你也可以将snprintf定义为_snprintf_s
#define snprintf(buf,len, format,...) _snprintf_s(buf, len,len, format, __VA_ARGS__)
链接地址: http://www.djcxy.com/p/86837.html
上一篇: snprintf and Visual Studio 2010
下一篇: llvm jit windows 8.1