Mir*_*pas 35 c c++ portability casting compiler-warnings
为什么这是一个警告?我认为在很多情况下使用multi-char int常量而不是"无意义"数字或者使用相同值定义const变量更为明确.解析wave/tiff /其他文件类型时,可以更清楚地将读取值与某些"EVAW","数据"等进行比较,而不是相应的值.
示例代码:
int waveHeader = 'EVAW';
Run Code Online (Sandbox Code Playgroud)
为什么这会发出警告?
小智 38
根据标准(§6.4.4.4/ 10)
包含多个字符的整数字符常量的值(例如,'ab'),[...]是实现定义的.
long x = '\xde\xad\xbe\xef'; // yes, single quotes
Run Code Online (Sandbox Code Playgroud)
这是有效的ISO 9899:2011 C.它编译没有警告下gcc用-Wall,和"多字符常量"与警告-pedantic.
来自维基百科:
多字符常量(例如'xy')是有效的,虽然很少有用 - 它们允许一个整数存储多个字符(例如,4个ASCII字符可以容纳32位整数,8个容纳在64位整数中).由于未指定将字符打包到一个int中的顺序,因此难以手动使用多字符常量.
为了便于携带,请不要使用带有整数类型的多字符常量.
Did*_*set 15
此警告对于错误地写入'test'应该写入的程序员很有用"test".
这种情况比实际需要多字符int常量的程序员更常发生.
blu*_*ift 13
如果你很高兴你知道你正在做什么并且可以接受可移植性问题,例如你可以在GCC上禁用警告:
-Wno-multichar
Run Code Online (Sandbox Code Playgroud)
我将此用于我自己的应用程序,以便出于类似的原因使用AVI和MP4文件头.
最简单的 C/C++ 任何编译器/标准兼容解决方案,@leftaroundabout 在上面的评论中提到:
int x = *(int*)"abcd";
Run Code Online (Sandbox Code Playgroud)
或者更具体一点:
int x = *(int32_t*)"abcd";
Run Code Online (Sandbox Code Playgroud)
另一种解决方案,也符合 C99 以来的 C/C++ 编译器/标准(除了 clang++,它有一个已知的错误):
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");
Run Code Online (Sandbox Code Playgroud)
这里匿名联合用于为所需的数字结果提供一个很好的符号名称,“abcd”字符串用于初始化复合文字(C99)的左值。
即使您愿意查找您的实现定义的行为,多字符常量仍会随字节顺序而变化。
最好使用 (POD) struct { char[4] }; ...然后使用像 "WAVE"_4cc 这样的 UDL 来轻松构建该类的实例