Есть ли какая-либо причина для объявления чего-либо «volatile const»? в С, но только «летучий» в С ++?

Я использовал заголовочный файл в моем проекте, который имел следующие определения:

#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.

8

Решение

В C ++ const переменные в области видимости файла по умолчанию имеют статическое связывание, что нежелательно для отображаемых в памяти GPIO. «Правильным» решением для этого является extern ключевое слово, но это не может быть использовано здесь, так как, очевидно, __I нужно работать с учениками. Так что устранение const делает связь по умолчанию extern, по желанию.

7

Другие решения