重新解释转换行为的GCC实现

GCC implementation for behavior of reinterpret cast

本文关键字:换行 GCC 实现 转换 新解释 解释      更新时间:2023-10-16

我怎么知道如何在GCC编译器上重新解释强制转换工作?文档中有提到吗?如果有参考资料或链接,我可以知道吗?

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

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

为整数:

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

我在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)并且相当清晰。

很难判断你的问题是否在询问更多的细节。