2011-10-13 78 views
24

为什么这是警告?我认为在很多情况下,使用多字符int常量而不是“无意义”数字或者使用相同值定义const变量时会更清楚。当解析wave/tiff /其他文件类型更清楚地将读取值与某些'EVAW','data'等比较,而不是相应的值。多字符常量警告

示例代码:

int waveHeader = 'EVAW'; 

为什么会出现这种给予警告?

+0

我无法理解您的问题。你能说清楚吗? – 2011-10-13 13:56:26

+0

@ 0A0D我会试试:)对不起 – Felics

+0

相关:http:// stackoverflow。com/questions/7497192/enum-constants-questions –

回答

28

According to the standard(§6.4.4.4/ 10)

包含多于一个 字符的整数字符常数的值(例如, 'AB'),[...]是实现定义。

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

这是有效的ISO 9899:2011 C.它编译没有与-Wallgcc下警告,“多字符常量”与-pedantic警告。

Wikipedia

多字符常量(例如“XY”)是有效的,虽然很少 有用 - 一个整数,他们让一个店几个字符(例如,4个 ASCII字符可以适合在32位整数,8位为64位)。 由于字符被打包到一个int中的顺序不是指定的 ,所以便携式使用多字符常量很困难。

为了便于携带,请不要在整数类型中使用多字符常量。

+3

我不确定最后一句话的含义是什么;多字符常量总是具有整型(并且这种不带前缀的常量总是具有类型“int”)。 –

12

此警告对于错误地编写'test'他们应该写入"test"的程序员很有用。

这比发生实际需要多字符int常量的程序员更经常发生。

+2

这是一个很好的例子,但是当我真的想写'test'并且我有警告时会发生什么。我不会在我的代码中发出任何警告... – Felics

+0

您必须应对警告,或者找到您的编译器选项来禁用此特定警告(这可能会在代码中的其他地方伤害您;-))。 –

+1

另一个意外的程序员错误是错误地记录了十六进制转义的语法,并且当一个意思是'\ x61'时写'\ 0x61'。 – tml

11

如果感到幸福你知道你在做什么,并能接受的便携性问题,海合会例如,你可以禁用命令行警告:

-Wno-multichar 

我用这个我自己由于类似的原因,应用程序可以使用AVI和MP4文件标题。

3

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

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

相关问题