C++ 有什么理由申报吗;挥发性常数;在C中,但仅限于;易挥发;在C++;?

C++ 有什么理由申报吗;挥发性常数;在C中,但仅限于;易挥发;在C++;?,c++,c,iar,cortex-m,cmsis,C++,C,Iar,Cortex M,Cmsis,我在项目中使用的头文件具有以下定义: 我的问题是为什么< C++ >代码>在C中是const,而不是C++?您仍然可以修改CR所指向的值,因为您有地址,但我只是好奇为什么\uu I的定义不同 对任何有兴趣的人来说,这是为了什么或来自什么, \u I定义来自Cortex-M4的IAR嵌入式工作台臂 ,结构来自德克萨斯仪器公司LM4F120H5QR CMSIS文件 const < /C>文件范围内的变量默认为静态链接,这对于内存映射GPIOs是不希望的。“正确”的修正是extern关键字,但这里不能

我在项目中使用的头文件具有以下定义:

我的问题是为什么< C++ >代码>在C中是const,而不是C++?您仍然可以修改CR所指向的值,因为您有地址,但我只是好奇为什么
\uu I
的定义不同

对任何有兴趣的人来说,这是为了什么或来自什么,
\u I
定义来自Cortex-M4的IAR嵌入式工作台臂
,结构来自德克萨斯仪器公司LM4F120H5QR CMSIS文件代码> const < /C>文件范围内的变量默认为静态链接,这对于内存映射GPIOs是不希望的。“正确”的修正是
extern
关键字,但这里不能使用,因为显然
\u I
也需要与类成员一起工作。因此,消除<代码> const >根据需要生成默认链接<代码>外部>代码>。

C++ >代码> const >赋予内部链接。我不知道它在C中是否存在,但我怀疑不是。无论如何,请注意,
\uu I
是为实现保留的名称,不应在用户代码中使用。@Mat McNabb我的意思是,由于我有CR寄存器的确切地址,我可以执行以下操作:#定义GPIO端口f\u CR\R(*(volatile unsigned long*)0x40025524),然后执行GPIO端口f\u CR\R=xxxxx,这会改变寄存器的值。@SoftwareDev OK-volatile const CR表示不能使用
CR
修改寄存器;当然,它可以在其他方面进行修改ways@MattMcNabb是的,这就是我认为你的意思,只是想补充一下,为其他人澄清一下。谢谢。如果这是原因,我还要指出,无论是谁编写了原始代码,都应该“分叉”成员变量,而不是globals@MattMcNabb当前位置事后诸葛亮总是20-20。C++的支持可能在GLULL和成员的C代码中使用宏之后很久了。@ BenVoigt是有意义的。基本上,编写这段代码的人说:“即使我们想要的是,也没有办法让CR只在C++中读取。”尽管我更倾向于编写C代码的人,因为根据它,CR寄存器的值可以从默认值更改,所以没有正确读取数据表,事实上,如果不能更改,就无法在我使用的开发板中的一个开关中启用上拉电阻器。@SoftwareDev:我没有查看特定芯片甚至LM4F系列的特定寄存器。但我猜这些宏用于所有特殊的函数寄存器,而不仅仅是GPIO CR?CR在头文件中被标记为仅输入可能是错误的,但确实有相当多的寄存器确实应该仅输入。@SoftwareDev:事实上,头文件可能故意比硬件更严格。如果要禁用编程管脚的编程功能,则只能写入
GPIOCR
。。。如果你有bug,这是一次单程旅行。
#ifdef __cplusplus
  extern "C" {
#endif 

#ifdef __cplusplus
  #define   __I     volatile             /*!< Defines 'read only' permissions*/
#else
  #define   __I     volatile const       /*!< Defines 'read only' permissions*/
#endif
    typedef struct {   
    // more members before         
      __I  uint32_t  CR;   /*!< GPIO Commit*/
    // more members after

    } GPIOA_Type;

#define GPIOF_BASE                      0x40025000UL
#define GPIOF                           ((GPIOA_Type *) GPIOF_BASE)