sprintf_s的包装器函数

C++, Wrapper function for sprintf_s

本文关键字:函数 包装 sprintf      更新时间:2023-10-16

在加入ban .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()编写包装器函数?

...不会神奇地从函数声明转换到使用这些参数的其他调用。你必须包含变量参数的东西,并使用它来调用下一级。

步骤基本如下:

  • 包含stdarg头。
  • 声明va_list .
  • call va_start .
  • 调用v*printf函数之一。
  • call va_end .

例如,下面是一个小程序,它演示了如何提供一个野兽,它将格式化的输出写入字符串,类似于您所追求的:

#include <stdio.h>
#include <stdarg.h>
void x (char *buf, char *fmt, ...) {
    va_list va;
    va_start (va, fmt);
    vsprintf (buf, fmt, va);
    va_end (va);
}
int main (void) {
    char buff[100];
    x (buff, "Hello, %s, aged %d", "Pax", 40);
    printf ("%sn", buff);
    return 0;
}
对于我来说,我倾向于忽略微软关于sprintf不安全的建议。只有当你不知道自己在做什么的时候,它才不安全,这也适用于任何工具。如果你想成为一名优秀的C程序员,你必须了解这种语言的局限性和缺点。

包括char*上使用sizeof的地方,期望它返回它指向的缓冲区的大小,而不是指针的大小:-)

但是,如果你想成为一个 c++ 开发者,就是一个 c++开发者。虽然C和c++有很多共同之处,但它们不是同一种语言。c++主要包含了很多C语言的东西,所以你可以(大部分)把已经写好的C代码用在你的c++应用程序中。

换句话说,如果它是一个c++应用程序,使用std::stringstd::stringstream (a)而不是char数组和s*printf调用。

你应该在编写c++代码时,就好像C位不存在一样。否则,你更像是一个c++程序员而不是c++程序员:-)


(a)当然,有知识的开发人员可能已经避开了stringstream固有的冗长内容,而使用类似fmtlib的东西(具有printf的简洁,但具有c++开发人员所欣赏的类型安全)。

特别是,因为它将被纳入c++ 20,成为基础的一部分,每个人都可以使用。