And*_*rew 100 c visual-studio-2010
我很遗憾被迫使用VS 2010进行项目,并注意到以下代码仍然不使用非标准兼容编译器构建:
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
char buffer[512];
snprintf(buffer, sizeof(buffer), "SomeString");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
(编译错误:C3861:'snprintf':找不到标识符)
我记得这是VS 2005的情况,我很震惊地看到它还没有被修复.
有没有人知道微软是否有计划将他们的标准C库迁移到2010年?
Val*_*lea 85
简短的说明: Microsoft最终在Visual Studio 2015中实现了snprintf.在早期版本中,您可以按如下方式模拟它.
长版:
以下是snprintf的预期行为:
int snprintf( char* buffer, std::size_t buf_size, const char* format, ... );
Run Code Online (Sandbox Code Playgroud)
将大多数
buf_size - 1字符写入缓冲区.除非buf_size为零,否则生成的字符串将以空字符终止 .如果buf_size为零,则不写入任何内容,并且buffer可能是空指针.返回值是假设无限制写入的字符数buf_size,不包括终止空字符.
Visual Studio 2015之前的版本没有符合要求的实现.相反,非标准扩展(例如,_snprintf()在溢出时不写空终止符)和_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
Run Code Online (Sandbox Code Playgroud)
ken*_*ytm 32
snprintf不属于C89.它仅在C99中是标准配置.微软没有支持C99的计划.
(但它也是C++ 0x中的标准......)
请参阅下面的其他答案以获得解决方法.
如果您不需要返回值,也可以将snprintf定义为_snprintf_s
#define snprintf(buf,len, format,...) _snprintf_s(buf, len,len, format, __VA_ARGS__)
Run Code Online (Sandbox Code Playgroud)
我相信 Windows 的等价物是sprintf_s
| 归档时间: |
|
| 查看次数: |
75178 次 |
| 最近记录: |