Sof*_*Dev 8 c c++ iar cmsis cortex-m
我在我的项目中使用了一个头文件,其中包含以下定义:
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
#define __I volatile /*!< Defines 'read only' permissions*/
#else
#define __I volatile const /*!< Defines 'read only' permissions*/
#endif
Run Code Online (Sandbox Code Playgroud)
将__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)
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么__I在C中使用const而不是在C++中?您仍然可以修改CR指向的值,因为您有地址,但我只是好奇为什么定义__I不同.
对于任何感兴趣的人来说,这些__I定义来自IAR Embedded Workbench ARM for Cortex-M4,结构来自德州仪器LM4F120H5QR CMSIS文件.
在C++中,const文件范围的变量默认为静态链接,这对于内存映射的GPIO来说是不可取的.对此的"正确"修复是extern关键字,但这里不能使用,因为显然也__I需要与类成员一起使用.因此,消除const会extern根据需要进行默认链接.