C++,sprintf_s的包装函数

lek*_*kai 2 c++ printf

包括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
}
Run Code Online (Sandbox Code Playgroud)

它给我一个错误 sprintf_s(buffer, sizeof(buffer), format,...);

错误C2059:语法错误:'...'

任何人都知道如何编写包装函数sprintf_s()

非常感谢.

pax*_*blo 8

...并没有神奇地从函数声明转换为使用这些参数的其他调用.你必须包含变量参数stuff并使用它来调用下一级别.

步骤基本上是:

  • 包括stdarg标题.
  • 宣布一个va_list.
  • 打电话va_start.
  • 调用其中一个v*printf功能.
  • 打电话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 ("%s\n", buff);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我,我倾向于忽略微软关于sprintf不安全的建议.如果您不知道自己在做什么,可以说任何工具都是不安全的.如果你想成为一名优秀的C程序员,你将学习该语言的局限性和缺陷.

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

但是,如果您想成为C++开发人员,请成为 C++开发人员.虽然C和C++有很多共性,但它们并不是同一种语言.C++主要包含很多C语言,因此您可以(大部分)采用已编写的C代码并在C++应用程序中使用它.

换句话说,如果它是一个C++应用程序,使用std::stringstd::stringstream,而不是char阵列和s*printf电话.

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