【发布时间】:2016-08-11 23:47:48
【问题描述】:
上下文:我在处理遗留代码,虽然我想慢慢地使这个代码达到 c++14 标准,但我仍然坚持使用 printf 之类的函数。 因此这种代码(简化):
#include <iostream>
#include <string>
#include <cstdio>
template <typename... Args>
const char* Format(const char* strFormat, Args... args)
{
static char szBuffer[10000];
auto len = std::vsnprintf(szBuffer, 10000, strFormat, args...);
if (len < 0 || 10000 <= len)
{
szBuffer[0] = 0;
}
return szBuffer;
}
int main()
{
auto test = Format("%s %s %d", "test", "test", 42);
}
这奇怪地不起作用:gcc&VS2013 无法从扩展参数包转到 va_arg。 (http://cpp.sh/4aue)
10:66: error: cannot convert 'const char*' to '__va_list_tag*' for argument '4' to 'int vsnprintf(char*, size_t, const char*, __va_list_tag*)'
为什么会出现这种行为? 同时奇怪的是中间 var_arg 函数编译和工作正常 (http://cpp.sh/2ggms)。
谢谢
【问题讨论】: