我故意写了这个错误的代码
printf("%d %d", 1);
使用
g++
和-Werror=format
进行编译。编译器发出以下令人印象深刻的警告:
error: format '%d' expects a matching 'int' argument [-Werror=format]
据我所知,编译器无法告诉代码是错误的,因为直到运行时才对格式字符串进行解析。
我的问题:编译器是否具有可用于printf和类似libc函数的特殊功能,或者这是我可以用于自己的函数的功能?字符串文字?
最佳答案
只要格式字符串是字符串文字,就可以在编译时对其进行解析。如果不是(通常这是个坏主意),那么您可以从-Wformat-security
收到有关此警告。
是的。
是的,只要您使用与printf
相同的格式字符串样式(或其他各种标准函数,例如scanf
或strftime
)。
void my_printf(Something, char const * format, SomethingElse, ...)
__attribute__ ((format (printf,2,4)));
表示第二个参数是
printf
样式的格式字符串,而要格式化的值以第四个参数开头。参见http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html。