const char* const non_literal_string = "Hello %d";
void my_print()
{
/*
* I would like GCC to throw a warning when compiling this line because the
* argument is not of int type.
*/
printf(non_literal_string, "World!");
//Like it does here
printf("Hello %d", "World!");
}
上面我已将
non_literal_string
声明为 const char* const
,因此指针和指向的字符串都不能更改,因此 GCC 可以检查提供的参数是否具有适合指定格式字符串的类型。
使用 clang 编译器,即使对非文字格式字符串也会执行这些检查,如果我尝试使用 clang 编译此代码,这就是输出:
<source>:11:32: warning: format specifies type 'int' but the argument has type 'char *' [-Wformat]
11 | printf(non_literal_string, "World!");
| ~~~~~~~~~~~~~~~~~~ ^~~~~~~~
<source>:3:47: note: format string is defined here
3 | const char* const non_literal_string = "Hello %d";
| ^~
| %s
<source>:14:24: warning: format specifies type 'int' but the argument has type 'char *' [-Wformat]
14 | printf("Hello %d", "World!");
| ~~ ^~~~~~~~
| %s
如何强制 gcc 对非文字格式字符串进行 printf 检查?
程序不会执行您希望程序执行的操作。 “强迫”gcc 做任何事情的唯一可能的方法就是改变它。您可以修改gcc源代码来进行检查并实现它。您可以将其作为错误或功能请求发布到 gcc bugzilla,并资助 gcc 开发 https://gcc.gnu.org/wiki/GNUToolchainFund .
该功能只是没有实现,它不存在。没有“强迫”。