多字符常量警告

为什么这是一个警告? 我认为有很多情况下更清楚地使用多字符int常量而不是“无意义”的数字,而不是定义具有相同值的常量variables。 当parsingwave / tiff /其他文件types比较清楚地将读取值与一些“EVAW”,“数据”等进行比较而不是相应的值。

示例代码:

int waveHeader = 'EVAW'; 

为什么会发出警告?

根据标准 (§6.4.4.4.10)

包含多个字符(例如'ab')的整数字符常量的值是实现定义的。

 long x = '\xde\xad\xbe\xef'; // yes, single quotes 

这是有效的ISO 9899:1999 C.它编译没有警告在gcc-Wall ,和一个“多字符字符常量”警告与-pedantic

维基百科 :

多字符常量(例如'xy')是有效的,尽pipe很less有用 – 它们让一个字符存储在一个整数中(例如,4个ASCII字符可以适合32位整数,8个适用于64位)。 由于没有指定将字符打包成一个int的顺序,所以便携式使用多字符常量是困难的。

为了便于携带,不要使用带有整数types的多字符常量。

这个警告对程序员来说是非常有用的,他们会错误地在应该写"test" 'test'地方写"test"

这比发生实际需要multi-char int常量的程序员更经常发生。

如果你很高兴你知道你在做什么,可以接受可移植性的问题,例如在GCC上,你可以禁用命令行中的警告:

 -Wno-multichar 

我使用这个为我自己的应用程序使用AVI和MP4文件标题出于类似的原因给你。

即使你愿意查看你的实现定义了什么行为,多字符常量仍然会随着字节顺序而变化。

最好使用(POD)struct {char [4]}; …然后使用像“WAVE”_4cc这样的UDL轻松构build该类的实例