GCC实现重新解释演员的行为

时间:2011-12-10 19:57:18

标签: c++ gcc reinterpret-cast

我怎么知道如何重新解释GCC编译器的演员表?它在文档中提到了吗?如果存在任何参考或链接,我可以知道吗?

2 个答案:

答案 0 :(得分:1)

阅读标准中的文档,它是非常明确的不同类型。但是对于我们的基本指针:

  

指针可以显式转换为足以容纳它的任何整数类型。映射函数是实现定义的。 [注意:对于那些了解底层机器的寻址结构的人来说,这并不奇怪。 - 结束注释] std :: nullptr_t类型的值可以转换为整数类型;转换与(void *)0到整数类型的转换具有相同的含义和有效性。 [注意:reinterpret_cast不能用于将任何类型的值转换为std :: nullptr_t类型。 - 结束说明]

对于整数:

  

可以将整数类型或枚举类型的值显式转换为指针。转换为足够大小的整数(如果实现上存在任何此类)并返回相同指针类型的指针将具有其原始值;指针和整数之间的映射在其他方面是实现定义的。 [注意:除3.7.4.3中描述的情况外,这种转换的结果不是安全派生的指针值。 -endnote]

答案 1 :(得分:1)

我用g ++多次使用reinterpret_cast。在嵌入式编程中,将表示外设寄存器的struct映射到其(固定)地址非常有用:

struct DEV_Registers
{
volatile uint32_t REGA;
volatile uint32_t REGB;
// ...
};

static DEV_Registers& DEV(*reinterpret_cast<DEV_Registers>(0x40000000));

这让我可以编写如下代码:

DEV.REGB = 0x12345678;

这是正确的事情(将寄存器设置为0x40000004,值为0x12345678)并且非常清晰。

很难说你的问题是否要求超出此范围的细节。