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

Gcc 如何获取错误字符串格式的警告(C+;+;),gcc,warnings,printf,compiler-warnings,Gcc,Warnings,Printf,Compiler Warnings,如果我使用了蹩脚的术语,请提前道歉 当我在GDB下编译C++应用程序并使用Primff()时,它会给出关于格式字符串和传入的参数的一致性的可怕警告。 例如,该代码: printf("%s %s", "foo"); 导致编译器警告“格式参数太少”,这非常有用。 它还将给出有关格式字符串类型与参数类型的警告。 它必须检查了格式字符串,并将其与提供的参数类型进行了比较。 -这种编译时内省是可以添加到普通源代码中的东西,还是需要编译到gcc本身中的东西 fwiw这是在os x上的gcc 4.2.1下。

如果我使用了蹩脚的术语,请提前道歉

当我在GDB下编译C++应用程序并使用Primff()时,它会给出关于格式字符串和传入的参数的一致性的可怕警告。 例如,该代码:

printf("%s %s", "foo");
导致编译器警告“格式参数太少”,这非常有用。 它还将给出有关格式字符串类型与参数类型的警告。 它必须检查了格式字符串,并将其与提供的参数类型进行了比较。 -这种编译时内省是可以添加到普通源代码中的东西,还是需要编译到gcc本身中的东西


fwiw这是在os x上的gcc 4.2.1下。您可以为自己的类似printf的函数(以及类似scanf/strftime/strfmon的函数)执行类似操作:


有关更多详细信息,请参阅。

手册中还有许多其他选项;它们不足以涵盖所有变量函数的一般情况;漂亮。谢谢你,保罗。在手册页中:“format属性指定一个函数接受printf、scanf、strftime或strfmon样式的参数,这些参数应该根据格式字符串进行类型检查”,因此,如果我有自己的nutty约束(例如printf-函数族以外的其他约束),这就不会真正起作用,但是在你链接到的页面中还有很多其他有趣的属性。谢谢令人惊叹的。有人知道英特尔C编译器是否有类似的功能吗?我在手册中找不到任何东西。@pavon:我想ICC可能也支持这一点,但我现在无法轻松检查-试试看-它要么支持它,要么只是默默地忽略它,但我不确定是哪一个。
#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);