从参数包到变量参数

From parameter pack to var args

本文关键字:参数 变量      更新时间:2023-10-16

上下文:我处理遗留代码,虽然我想慢慢地使这些代码达到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)。

谢谢

您想要snprintf,而不是vsnprintf。参数包展开为逗号分隔的列表。这些函数的v版本只接受va_list

在查看代码示例时,如果您打算传递std::string,则仍然需要transform_to_c之类的函数。

边注:您应该考虑该代码是否需要线程安全或可重入。使用静态缓冲区意味着两者都不是。