我故意写了这个错误的代码

printf("%d %d", 1);

使用g++-Werror=format进行编译。

编译器发出以下令人印象深刻的警告:
error: format '%d' expects a matching 'int' argument [-Werror=format]

据我所知,编译器无法告诉代码是错误的,因为直到运行时才对格式字符串进行解析。

我的问题:编译器是否具有可用于printf和类似libc函数的特殊功能,或者这是我可以用于自己的函数的功能?字符串文字?

最佳答案



只要格式字符串是字符串文字,就可以在编译时对其进行解析。如果不是(通常这是个坏主意),那么您可以从-Wformat-security收到有关此警告。



是的。



是的,只要您使用与printf相同的格式字符串样式(或其他各种标准函数,例如scanfstrftime)。

void my_printf(Something, char const * format, SomethingElse, ...)
    __attribute__ ((format (printf,2,4)));

表示第二个参数是printf样式的格式字符串,而要格式化的值以第四个参数开头。参见http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html

07-25 23:38
查看更多