【发布时间】:2014-09-20 11:01:39
【问题描述】:
包含banned.h(微软安全工具之一)后,编译器警告我sprintf()函数不安全,MSDN中心给了我使用sprintf_s的建议,因为我的项目是跨平台的,我为 sprintf 函数写了一个包装器。
//safe function for sprintf();
void WrapperSprintf( char *buffer, const char *format, ... )
{
#ifdef _WIN32
sprintf_s(buffer, sizeof(buffer), format,...);
#else
sprintf(buffer, format, ...);
#endif
}
它在sprintf_s(buffer, sizeof(buffer), format,...); 行给我一个错误
错误 C2059:语法错误:'...'
有人知道如何为sprintf_s() 编写包装函数吗?
非常感谢。
【问题讨论】:
-
sizeof(buffer)不符合您的预期,它的输出始终与sizeof(char*)相同。 -
这是使用宏的有效案例。
#define my_sprintf sprintf -
如果你使用
stringstream,你可以完全放弃sprintf。 -
微软添加的所有这些xxx_s函数都有一个新的非常重要的参数:max_size。一些重载可以在没有它的情况下使用,但可以使用固定数组(例如 template
int sprintf_s(char[N] buffer,...) 调用 sprintf_s(char* butter, size_t N, ...) ...之类的)。这是 strnlen 与 strlen 的模式。因此,您应该更改代码并始终传递“最大尺寸”参数并在非 Windows 平台中忽略它,或者在 Windows 平台中传递一些预定义的 max_size(如 1028)。 -
@πάνταῥεῖ 感谢您指出这一点:)