如何获取错误字符串格式的警告(C++)

ori*_*zil 15 printf gcc warnings compiler-warnings

如果我使用不好的术语,请提前道歉.

当我在gdb下编译一个C++应用程序并使用printf()时,它给出了与格式字符串的一致性和传入的参数有关的令人敬畏的警告.

例如,这段代码:

printf("%s %s", "foo");
Run Code Online (Sandbox Code Playgroud)

导致编译器警告"格式参数太少",这非常有用.它还会提供有关格式字符串类型与参数类型的警告.它必须检查格式字符串并将其与提供的参数类型进行比较. - 这种编译时内省可以添加到普通源代码中,还是需要编译成gcc本身的东西?

fwiw这是在os x的gcc 4.2.1下.

Pau*_*l R 10

您可以为自己的类似printf的函数(以及scanf/strftime/strfmon函数)执行此类操作:

#define PRINTF_FORMAT_CHECK(format_index, args_index) __attribute__ ((__format__(printf, format_index, args_index)))

void my_printf(const char *fmt, ...) PRINTF_FORMAT_CHECK(1, 2);
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅gcc手册.

  • 手册中还有许多其他选项; 但它们不足以涵盖所有可变函数的一般情况. (3认同)
  • 呵呵; 俏皮.谢谢保罗.从手册页:"format属性指定一个函数采用printf,scanf,strftime或strfmon样式参数,这些参数应该根据格式字符串进行类型检查"所以看起来我是否有自己的坚果约束(例如,除了printf-函数系列)这不会真正做到这一点,但是你链接到的页面中还有一大堆其他有趣的__attributes__.谢谢 ! (2认同)