Mr.*_*ith 2 c++ gcc visual-c++
我正在编译为GCC编写的代码,在Visual C++ 2012中.我收到有关枚举值截断的警告,其中包含以下枚举(由于值超出了int的范围):
enum tile_flags {
TILE_FLAG_INNER_FLAME= 0x10000000ULL,
TILE_FLAG_CONSTRICTED= 0x20000000ULL,
TILE_FLAG_MIMIC_INEPT 0x2000000000ULL
TILE_FLAG_MIMIC 0x4000000000ULL
TILE_FLAG_MIMIC_RAVEN 0x6000000000ULL
TILE_FLAG_MIMIC_MASK 0x6000000000ULL
}
Run Code Online (Sandbox Code Playgroud)
在编译x86时,看起来MSVC会简单地截断枚举值以适应32位.但是,GCC中没有发生截断.海湾合作委员会发生了什么?我怎样才能为MSVC做这项工作?
chr*_*ris 10
从N3485,§7.2/ 6:
对于其基础类型未固定的枚举,基础类型是一个整数类型,可以表示枚举中定义的所有枚举值.如果没有整数类型可以表示所有枚举器值,则枚举是不正确的.它是实现定义的,其中整数类型用作底层类型,除了底层类型不应大于int,除非枚举器的值不能在int或unsigned int中.如果枚举器列表为空,则基础类型就好像枚举具有值为0的单个枚举器一样.
因此,如果MSVC具有必要的long long支持,则无论如何都应该使其成为基础类型.看到它没有,你可以尝试一下来哄它.
指定基础类型:
enum tile_flags : unsigned long long {
...
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
133 次 |
| 最近记录: |