2010-02-08 12 views
13

道歉。如果我使用的术语不好,如何获得不正确字符串格式的警告(C++)

当我编译C gdb下和使用的printf(++应用)它使我与该格式串的一致性真棒警告和在传递的参数

例如,这样的代码:。

printf("%s %s", "foo"); 

导致编译器警告“格式太少的参数”,这是超级有用的。 它也会给出有关格式字符串类型与参数类型的警告。 它必须检查格式字符串并将其与所提供的参数类型进行比较。 - 这种编译时自省可以添加到普通的源代码中,还是需要编译进gcc本身?

fwiw这是根据gcc 4.2.1在os x上。

回答

9

您可以为您自己的类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); 

进一步的详情请参见gcc manual

+3

手册中还有其他一些选项;但它们不足以涵盖所有可变参数函数的一般情况。 – 2010-02-08 18:47:10

+2

呵呵;俏皮。谢谢保罗。 “format属性指定一个函数采用printf,scanf,strftime或strfmon样式参数,这些参数应该根据格式字符串” 进行类型检查,因此看起来好像我拥有自己的坚果约束(例如printf-系列函数以外的东西),但这并不是真正的诀窍,但在链接的页面中还有一大堆其他有趣的__attributes__。谢谢 ! – 2010-02-08 20:19:54

+0

太棒了。任何人都知道英特尔C编译器是否有类似的东西?我在手册中找不到任何内容。 – pavon 2014-09-26 17:37:22

相关问题