8

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

#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 文件。

4

1 回答 1

8

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

于 2014-10-19T21:14:24.763 回答