【发布时间】:2014-10-19 21:01:02
【问题描述】:
我在我的项目中使用了一个具有以下定义的头文件:
#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 中是 const 而不是在 C++ 中?由于您有地址,您仍然可以修改 CR 指向的值,但我只是好奇为什么 __I 的定义不同。
对于任何对此感兴趣或来自何处的人,
__I 定义来自 IAR Embedded Workbench ARM for Cortex-M4
, 结构来自德州仪器 LM4F120H5QR CMSIS 文件。
【问题讨论】:
-
在 C++ 中
const提供内部链接。我不知道它是否在 C 中,但我怀疑不是。无论如何,请注意__I是为实现保留的名称,不应在用户代码中使用。 -
@Mat McNabb 我的意思是,因为我有 CR 寄存器的确切地址,我可以执行以下 #define GPIO_PORTF_CR_R (*((volatile unsigned long *)0x40025524)) ,然后执行 GPIO_PORTF_CR_R = xxxxx ,然后这会改变寄存器的值。
-
@SoftwareDev OK -
volatile const CR表示您不能使用CR修改寄存器;当然也可以用其他方式修改 -
@MattMcNabb 是的,这就是我认为您的意思,只是想添加它以供其他人澄清。谢谢。