Я использовал файл заголовка в своем проекте, который имел следующие определения:
#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 LM4F120H5QR Texas Instruments.
const
обеспечивает внутреннюю связь. Я не знаю, работает ли это в C, но подозреваю, что нет. В любом случае, обратите внимание, что__I
— это имя, зарезервированное для реализации, и его не следует использовать в пользовательском коде. - person Cheers and hth. - Alf   schedule 20.10.2014volatile const CR
означает, что вы не можете использоватьCR
для изменения регистра; конечно, это можно изменить другими способами - person M.M   schedule 20.10.2014