Я использовал заголовочный файл в моем проекте, который имел следующие определения:
#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
быть сделано const в C, но не в C ++? Вы все еще можете изменить значение, на которое указывает CR, поскольку у вас есть адрес, но мне просто интересно, почему определение __I
это отличается.
Для всех, кому интересно, для чего это нужно,
__I
определяет из IAR Embedded Workbench ARM для Cortex-M4
и структура взята из файлов CMSIS компании Texas Instruments LM4F120H5QR.
В C ++ const
переменные в области видимости файла по умолчанию имеют статическое связывание, что нежелательно для отображаемых в памяти GPIO. «Правильным» решением для этого является extern
ключевое слово, но это не может быть использовано здесь, так как, очевидно, __I
нужно работать с учениками. Так что устранение const
делает связь по умолчанию extern
, по желанию.