在C++中用字符定义DWORD常量是否合法?Visual C++2008可编译存疑
在C++中使用多字符字面量定义DWORD常量的合法性分析
这种写法是合法的,但存在实现定义行为和可移植性问题,具体细节如下:
C标准允许使用多字符字面量(比如
'WAVE'),它的类型是int,但具体的数值由编译器实现决定。不同编译器、不同字节序的平台可能会解析出不同的值——你示例中的0x45564157是Visual C按小端字节序解析的结果(字符W(0x57)、A(0x41)、V(0x56)、E(0x45)按小端顺序拼接),如果换成大端平台的编译器,结果会是0x57415645。DWORD是Windows平台定义的无符号32位整数类型,在32位或64位Windows系统下,
int的宽度通常和DWORD匹配,所以把多字符字面量赋值给const DWORD在VC中能正常编译。但本质上是依赖编译器的类型转换规则,并非标准强制的安全行为。这种写法的最大问题是可移植性差,如果你的代码需要跨平台(比如转到GCC、Clang或其他非Windows编译器),结果可能不符合预期。更稳妥的写法是直接使用十六进制常量,比如
const DWORD WAVE_FORMAT = 0x45564157;,这样数值明确,不受编译器或平台影响。
内容的提问来源于stack exchange,提问作者alancc
相关产品推荐
相关产品推荐

