我希望g++在vsnprintf中检测以下不正确的隐式转换。
我尝试:

g++ -Wall -Werror -Wconversion -Wformat  test.cpp -o test.ext

但是没有警告。代码如下:
#include <cstdio>
#include <cstdarg>


void PrintFError ( const char * format, ... )
{
  char buffer[256];
  va_list args;
  va_start (args, format);
  vsnprintf (buffer,256,format, args);
  perror (buffer);
  va_end (args);
}


enum LEVEL
 {
     INFO = 1,
     WRN = 2
 };

int main ()
{

  PrintFError ("Error opening %s", WRN); // WRN is enum not char*, expecte some compile warning here

  return 0;
}

最佳答案

您必须在函数中添加属性以允许gcc检查:

void PrintFError ( const char * format, ... ) __attribute__ ((format (printf, 1, 2)))

现在最好使用可变参数模板。就像是
template <typename ...Ts>
void PrintFError (const char * format, Ts&&...args)
{
    char buffer[256];
    vsnprintf (buffer, 256, format, std::forward<Ts>(args)...);
    perror (buffer);
}

关于c++ - 如何通过GCC在vsnprintf中检测隐式转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30393665/

10-15 17:22