我怎么知道重新解释转换如何在 GCC 编译器上工作?文档中提到了吗?如果存在,我可以知道任何参考或链接吗?
问问题
1059 次
2 回答
1
阅读标准中的文档,对于不同的类型非常明确。但是对于基本指针,我们有:
指针可以显式转换为任何大到足以容纳它的整数类型。映射函数是实现定义的。[注意:对于那些知道底层机器的寻址结构的人来说,这并不奇怪。— 尾注] std::nullptr_t 类型的值可以转换为整数类型;该转换与将 (void*)0 转换为整数类型具有相同的含义和有效性。[注意:不能使用 reinterpret_cast 将任何类型的值转换为 std::nullptr_t 类型。——尾注]
对于整数:
整数类型或枚举类型的值可以显式转换为指针。转换为足够大小的整数(如果实现中存在这样的整数)并返回相同指针类型的指针将具有其原始值;指针和整数之间的映射是由实现定义的。[注意:除 3.7.4.3 中描述的情况外,这种转换的结果不会是安全派生的指针值。——尾注]
于 2011-12-10T20:13:07.023 回答
1
我已经reinterpret_cast
多次使用 g++。struct
在嵌入式编程中,将表示外设寄存器的 a映射到其(固定)地址非常有用:
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)并且非常清晰。
很难判断您的问题是否要求提供除此之外的详细信息。
于 2011-12-10T20:15:49.633 回答