比较void *和uint16_t

时间:2014-04-04 12:55:23

标签: c++ gcc gcc4.6

在一些遗留代码中,它在GCC 4.6上编译得很好(-fpermissive),我有这个:

uint16_t a = 0;
void* b = ...;

if(b == a) // ...

这个比较是否在GCC 4.6上定义明确?它是向下转换为16位还是向上转换为32/64位?

3 个答案:

答案 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 )
{
}

请注意,向上转换/向下转换不是正确使用的词,因为它与类有关,在这种情况下只是类型转换。

相关问题