c++ - 是否有任何理由在 C 中声明 "volatile const"而在 C++ 中仅声明 "volatile"?

标签 c++ c iar cortex-m cmsis

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

#ifdef __cplusplus
  extern "C" {
#endif 

#ifdef __cplusplus
  #define   __I     volatile             /*!< Defines 'read only' permissions*/
#else
  #define   __I     volatile const       /*!< Defines 'read only' permissions*/
#endif

__I在另一个头文件中使用如下:

    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)

我的问题是为什么 __I 在 C 中而不是在 C++ 中成为常量?您仍然可以修改 CR 指向的值,因为您有地址,但我只是好奇为什么 __I 的定义不同。

对于任何对它的用途或来源感兴趣的人, __I 定义来自 IAR Embedded Workbench ARM for Cortex-M4 ,结构来自德州仪器 LM4F120H5QR CMSIS 文件。

最佳答案

在 C++ 中,文件范围内的 const 变量默认为静态链接,内存映射 GPIO 不需要这种链接。对此的“正确”修复是 extern 关键字,但不能在此处使用,因为显然 __I 也需要与类成员一起使用。因此,根据需要,消除 const 会生成默认链接 extern

关于c++ - 是否有任何理由在 C 中声明 "volatile const"而在 C++ 中仅声明 "volatile"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26455373/

相关文章:

c++ - Qt Creator - UI 类的自定义命名空间

c++ - 左移运算符 C++ 的意外输出

c++ - 调整 QGraphicsScene 大小时的事件

c++ - 根据 lambda 签名选择类型

c - 从CLIB到DLIB:size_t未定义

c - sscanf %u 不解释十六进制

这个 "attack"是否真的会导致快速排序降级为二次运行时间,即使项目已被随机打乱?

当数据复制/扫描/读取到未初始化的指针时崩溃或 "segmentation fault"

c++ - 从 C 调用 C++ 函数以返回 char *

启用功能时代码行为不当(可能的大小限制)