C ++中是否允许这样的内容?如果是这样,我该怎么做?
myFunction("User input: %s", a);
或者是首先将其格式化然后通过它的唯一方法?
答案 0 :(得分:3)
如果你想编写一个带变量参数的函数,答案是肯定的,这就是你如何声明这样一个函数:
void myFunction(const char*, ...);
注意最后的省略号。
但既然你知道怎么做,我会为你复杂化。你不应该这样做。上面声明的myFunction()
类型不安全,完全避开C ++必须保护您免受错误的所有方法。
还有其他方法可以实现这样的事情(vector
浮现在脑海中),但我发现如果你需要一个带有可变参数的函数,那就是代码气味,表明存在某些问题首先是你的设计错了。仔细看看为什么你需要这个。
如果你要做的不是传递变量参数本身,而是传递格式化的字符串(就像你说的那样),那么你需要在你的函数中自己进行字符串格式化。根据您的平台,有很多方法可以做到这一点。在Windows中,您可能使用vsprintf()
或类似的东西。
但是,如果你需要这样做,还有更好的方法。就个人而言,我喜欢使用Boost format。
答案 1 :(得分:3)
我想你想要的是从myFunction调用类似vsprintf的函数 - 这样你就可以在函数内部进行格式化。例如:
void myFunction(const char *format, ...)
{
char buf[1024];
va_list arglist;
va_start( arglist, format );
vsprintf(buf,format,arglist);
va_end( arglist );
}
答案 2 :(得分:1)
做你正在做的事情是合法的,除了:
sprintf
的行为是将格式应用于字符串。在该函数之外(以及一般的printf
族),这里的参数并不真正意味着什么,因为你的函数签名可能如下所示:
void myFunction(const char* str1, const char* str2);
但它做什么取决于你。
如果你想在将字符串传递给某个函数之前修改它,你必须在myFunction
之外修改它(通过sprintf
或其他)或者传递所有参数并调用{{1在函数内部。
答案 3 :(得分:0)
是的,这是允许的。不,它不是标准库的一部分,因此您必须自己实现它。
答案 4 :(得分:0)
可以使用C库中的vsprintf()函数,并将myFunction()
写为变量参数。
然而,关于变量参数方法的通常免责声明适用:以这种方式引入缓冲区溢出或分段违规非常容易。有些编译器允许您将myFunction()
声明为“类似printf”,这样您就可以对参数进行一定程度的编译时检查,但这不是可移植的。