多字符恒定警告

时间:2011-10-13 13:54:27

标签: c++ c casting compiler-warnings portability

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

示例代码:

int waveHeader = 'EVAW';

为什么会发出警告?

6 个答案:

答案 0 :(得分:36)

According to the standard(§6.4.4.4/ 10)

  

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

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

这是有效的ISO 9899:2011 C.它在gcc-Wall编译时没有警告,-pedantic编号为“多角色常量”警告。

来自Wikipedia

  

多字符常量(例如'xy')是有效的,尽管很少   有用 - 他们让一个整数存储几个字符(例如4   ASCII字符可以适合32位整数,8位64位整数。   由于字符被打包到一个int中的顺序不是   指定的,便携式使用多字符常量很困难。

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

答案 1 :(得分:14)

此警告对于错误地将'test'写入应写在"test"处的程序员非常有用。

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

答案 2 :(得分:13)

如果您很高兴您知道自己在做什么并且可以接受可移植性问题,例如您可以在GCC上禁用警告:

-Wno-multichar

我将此用于我自己的应用程序,以便出于类似的原因使用AVI和MP4文件头。

答案 3 :(得分:4)

即使您愿意查找实现所定义的行为,多字符常量会因字节顺序而异。

最好使用(POD)struct {char [4]}; ...然后使用类似" WAVE" _4cc的UDL轻松构造该类的实例

答案 4 :(得分:0)

@leftaroundabout在上面的评论中提到了最简单的C / C ++编译器/标准兼容解决方案:

int x = *(int*)"abcd";

或更具体一点:

int x = *(int32_t*)"abcd";

另一种解决方案,也符合任何C / C ++编译器/标准(clang ++除外,has a known bug):

int x = ((union {char s[5]; int number;}){"abcd"}).number;

/* just a demo check: */
printf("x=%d stored %s byte first\n", x, x==0x61626364 ? "MSB":"LSB");

将“ abcd”字符串文字转换为数组,然后使用匿名联合为所需的数字结果提供一个漂亮的符号名称。

答案 5 :(得分:0)

如果要禁用此警告,重要的是要知道在GCC和Clang中有两个相关的警告参数:GCC Compiler options -wno-four-char-constants and -wno-multichar

相关问题