2013-09-27 61 views
0

GCC编译器能否正确处理以下内容?C中指针和整数之间的有意比较

uint32 fn(uint32 adr, uint8 *ptr) { 
    return (ptr==adr); 
} 

换句话说它会自动将ptr转换为一个整数来存储指向的内存地址吗?

+1

这个无意义的情况怎么可能被“正确地处理”呢? – 2013-09-27 16:15:34

+0

它不是'无意义的案例'。我对使用PIC32的定制仪器进行编程,以管理外部RAM/NVM以及PIC内存中的数据。这意味着整数地址和指针的混合。它工作得很好。我只想了解编译器是否将指针转换为表示指向地址的整数。 –

+1

也许会。或者也许不会。如果你想符合要求,你可以明确地进行演员阵容。 – 2013-09-27 16:24:05

回答

1

是的,GCC会正确处理它 - 通过诊断代码中的错误。

C在整数类型和指针类型之间没有隐式转换(除了整数常量0的特例被视为空指针常量),==无法比较整数和指针类型的值。

要纠正这个错误,加铸(显式转换)转换adr键入uint8*

return ptr == (uint8*)adr; 

,或者甚至更好,使同一类型的两个参数在首位:

uint32 fn(uint8 *adr, uint8 *ptr) { 
    return ptr == adr; 
} 

除非你有一些特定的原因,adr需要是一个整数而不是一个指针,但你没有告诉我们可能是什么原因。

C是更强类型,很多人认为它是。

+0

我希望它将ptr转换为int32,而不是adr转换为uint8 *。我只是施展它。 –

+0

@DamienHoreau:为什么你转换成其他类型的是哪一个? (你的意思是'uint32',而不是'int32',对吧?) –

相关问题