可能重复:
警告:格式不是字符串文字,也不是格式参数
我有一个非常简单的问题:为什么当我char[] s = "hi"; printf(s)
发出警告时:"警告:格式化不是字符串文字而没有格式参数",同时printf("aa")
没有.
我已经读过char数组和字符串文字之间的区别(一个是const char const*
另一个char*
),但是来自printf()
签名:
我发现它适用于任何类型.所以我的问题是为什么printf("aaa")
不发出任何警告(它以某种方式检查文字是一个const,同时数组不是)?
GNU编译器和许多其他编译器现在确实printf
根据提供的参数检查-family 的格式字符串.编译器警告它不能对非文字字符串执行此操作.
使用非文字格式字符串被认为是一种不好的做法.使用您无法控制的格式字符串会更糟糕.