重新解释转换行为的GCC实现
GCC implementation for behavior of reinterpret cast
我怎么知道如何在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)并且相当清晰。
很难判断你的问题是否在询问更多的细节。
相关文章:
- 使用一个考虑到std::map中键值的滚动或换行的键
- 如何防止clang格式在流运算符调用之间添加换行符<<
- C/C++ - 查询平台相关的换行符(用于内存映射文件)
- 在 Stream C++ 文本之前有一个额外的换行符
- 流:CSV 文件中的换行符
- 将缓冲区复制到剪贴板 [换行错误]
- 如何在三元条件运算符中添加换行符和连接? :在 C++ 中
- Clang-格式:在多行语句之后的换行符上打开大括号
- 如何正确转发/换行static_cast?
- 在输出流中插入换行符
- 防止控制台在通道字符(在 c++ 中)中输入空格(即空格、制表符和换行符)
- QProcess::readAllStandardOutput() 和换行符
- 如果有换行符,clang 格式不会附加大括号
- 创建一个简单的前向迭代器,该迭代器在循环缓冲区的"end"处自动换行
- C++在标点符号后将字符串换行
- 提取后返回换行符的C++istream.get()
- 如何在出现换行符之前将多个整数作为输入?
- 正则表达式 获取两个换行符之间的文本
- 包含换行符分隔的单词的文件和C++中这些单词的字符串向量的大小是否相同?
- 当文件有换行符时,ifstream::tellg在MSVC2012和gcc(mingw)上有所不同