VS2010。我正在将sprintf stmts转换为sprintf_s。我注意到有两个实现,来自intellisense:
int sprintf_s<_Size>(char (&_Dest)[_Size], const char *_Format, ...)
int sprintf_s(char * _DestBuf, size_t _SizeInBytes, const char *_Format, ...)
那么编译器怎么会不接受:
void Test(char buf[])
{
sprintf_s<10>(buf, "%s", "test");
}
答案 0 :(得分:0)
如果你想使用模板化版本,我们的想法是编译器可以从传递给sprintf_s的参数中推导出_Size模板参数,而不是你指定它。
所以基本上,你这样使用它:
char dest[10];
sprintf_s(dest, "Format %s string", "blah");
答案 1 :(得分:0)
The documentation表示您需要定义一个或两个宏来启用这些模板重载。我不认为这些是直接使用的,而是用于在编译时通过C ++模板而不是运行时检查来检查静态缓冲区的大小。