在一些遗留代码中,它在GCC 4.6上编译得很好(-fpermissive
),我有这个:
uint16_t a = 0;
void* b = ...;
if(b == a) // ...
这个比较是否在GCC 4.6上定义明确?它是向下转换为16位还是向上转换为32/64位?
答案 0 :(得分:1)
虽然这没有在C ++ 11标准(N3337草案)中明确写出,但我能够提出这个(强调我的)。
§5.9关系运算符
可以比较相同类型的对象或函数的指针(在指针转换之后),结果定义如下
- 如果有两个指针......
- 如果有两个指针......
- 如果有两个指针......
- 如果有两个指针......
- 如果有两个指针......
- 未指定其他指针比较。
现在是平等部分:
§5.10平等运营商
==(等于)和!=(不等于)运算符与关系运算符具有相同的语义限制,转换和结果类型,除了它们的优先级和真实性 - 价值结果。
据此,我相信这样的比较是未指明的。
答案 1 :(得分:1)
看起来它向上转换16位整数以匹配指针大小。
运行以下代码会输出"upcast"
uint16_t a = 1;
void* b = (void*)0x10001;
(b == a) ? printf("downcast") : printf("upcast");
答案 2 :(得分:0)
它可能编译也可能不编译(不确定,它取决于编译器和编译器选项) 在任何情况下,演员表将执行如下:
if( b == (void*)a )
{
}
请注意,向上转换/向下转换不是正确使用的词,因为它与类有关,在这种情况下只是类型转换。