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

发布于 2024-12-20 11:25:31 字数 64 浏览 1 评论 0原文

我如何知道重新解释强制转换将如何在 GCC 编译器上工作?文档中有提到吗?我可以知道任何参考或链接(如果存在)吗?

How can I know how will reinterpret cast work on GCC compiler? Is it mentioned in the documentation? May I know any reference or link if it exist?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

寄意 2024-12-27 11:25:31

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

指针可以显式转换为任何足够大以容纳它的整型。映射函数是实现定义的。 [ 注意:它的目的是让那些知道底层机器的寻址结构的人不会感到惊讶。 --尾注] std::nullptr_t 类型的值可以转换为整型;该转换与 (void*)0 到整型的转换具有相同的含义和有效性。 [注意:reinterpret_cast 不能用于将任何类型的值转换为 std::nullptr_t 类型。 ——尾注]

对于整数:

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

Reading the documentation in the standard it is very explicit about different types. But for the basic pointer we have:

A pointer can be explicitly converted to any integral type large enough to hold it. The mapping function is implementation-defined. [ Note: It is intended to be unsurprising to those who know the addressing structure of the underlying machine. — end note ] A value of type std::nullptr_t can be converted to an integral type; the conversion has the same meaning and validity as a conversion of (void*)0 to the integral type. [Note: A reinterpret_cast cannot be used to convert a value of any type to the type std::nullptr_t. — end note ]

For integers:

A value of integral type or enumeration type can be explicitly converted to a pointer. A pointer converted to an integer of sufficient size (if any such exists on the implementation) and back to the same pointer type will have its original value; mappings between pointers and integers are otherwise implementation-defined. [Note: Except as described in 3.7.4.3, the result of such a conversion will not be a safely-derived pointer value. —endnote]

水晶透心 2024-12-27 11:25:31

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

很难判断您的问题是否要求提供除此之外的详细信息。

I have used reinterpret_cast many times with g++. In embedded programming, it's useful for mapping a struct that represents a peripheral's registers to its (fixed) address:

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

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

This lets me write code like:

DEV.REGB = 0x12345678;

which does the right thing (set the register at 0x40000004 to the value 0x12345678) and is quite legible.

It's hard to tell if your question is asking for details beyond this.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文