为什么printf(char [])会生成警告,而printf("asdf")则不会

dhb*_*lah 5 c printf gcc

可能重复:
警告:格式不是字符串文字,也不是格式参数

我有一个非常简单的问题:为什么当我char[] s = "hi"; printf(s)发出警告时:"警告:格式化不是字符串文字而没有格式参数",同时printf("aa")没有.

我已经读过char数组和字符串文字之间的区别(一个是const char const*另一个char*),但是来自printf()签名:

http://www.gnu.org/software/libc/manual/html_node/Formatted-Output-Functions.html#Formatted-Output-Functions

我发现它适用于任何类型.所以我的问题是为什么printf("aaa")不发出任何警告(它以某种方式检查文字是一个const,同时数组不是)?

D.S*_*ley 6

GNU编译器和许多其他编译器现在确实printf根据提供的参数检查-family 的格式字符串.编译器警告它不能对非文字字符串执行此操作.

使用非文字格式字符串被认为是一种不好的做法.使用您无法控制的格式字符串会更糟糕.