Io sto usando un file di intestazione nel mio progetto che ha avuto il seguente define (s):C'è qualche ragione per dichiarare qualcosa "volatile const" in C ma solo "volatile" in C++?
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
#define __I volatile /*!< Defines 'read only' permissions*/
#else
#define __I volatile const /*!< Defines 'read only' permissions*/
#endif
Il __I
è utilizzato come segue in un altro file di intestazione:
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)
La mia domanda è perché sarebbe il __I
deve essere fatto const in C ma non in C++? Puoi ancora modificare il valore che CR sta indicando poiché hai l'indirizzo, ma sono solo curioso perché la definizione di __I
è diversa.
Per chiunque sia interessato di cosa si tratta per o, i __I
definisce sono da IAR Embedded Workbench per ARM Cortex-M4 , e struct da file di Texas Instruments LM4F120H5QR CMSIS.
In C++ 'const' conferisce il collegamento interno. Non so se lo faccia in C, ma sospetto di no. Ad ogni modo, si noti che '__I' è un nome riservato all'implementazione e non deve essere utilizzato nel codice utente. –
@Mat McNabb intendevo dire che dal momento che ho l'indirizzo esatto del registro CR posso fare quanto segue #define GPIO_PORTF_CR_R (* ((volatile unsigned long *) 0x40025524)), quindi fare GPIO_PORTF_CR_R = xxxxx, e che cambia il valore del registro . – SoftwareDev
@SoftwareDev OK - il 'volatile const CR' significa che non è possibile usare' CR' per modificare il registro; ovviamente può essere modificato in altri modi –