我在我的项目中使用的头文件具有以下定义:
#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/