Alcune citazioni dallo standard C99 (il corsivo è mio)
6.2.5/25 Tipo
Qualsiasi tipo finora detto è un tipo non qualificato. Ogni tipo non qualificato di ha diverse versioni qualificate del suo tipo, corrispondenti alle combinazioni di uno, due o tutti e tre i qualificatori const, volatile e restrittivo. Le versioni qualificato o non qualificato di tipo sono distinti tipi
6.2.7/2 "tipo compatibile e tipo composito"
Due tipi hanno tipo compatibile se i loro tipi sono uguali.
...
Tutte le dichiarazioni che si riferiscono allo stesso oggetto o funzione avrà tipo compatibile; altrimenti, , il comportamento non è definito.
Se pensate al vostro esempio specifico per un momento, come sarebbe il codice che vede solo la seguente dichiarazione:
extern unsigned char flag;
hanno alcuna idea che flag
avrebbe bisogno di essere trattati come volatile
?
Inoltre, indipendentemente dalla tua domanda, tieni presente che il numero volatile
di solito non è sufficiente per gestire l'accesso tramite più thread (nel caso in cui sia ciò che intendi).
fonte
2014-05-22 17:32:06
Si sta utilizzando un compilatore C o C++? Non sembra che dovresti usare il tag 'C++' qui. –
Ora, se volevi sapere se la risposta sarebbe diversa tra C e C++, va bene. Utilizza entrambi i tag ** e spiega nella tua domanda in che modo ti interessano entrambe le lingue **. –
Il compilatore, avendo solo quella * dichiarazione * extern e generando il codice per accedere alla variabile ovviamente non può sapere che si suppone che sia trattato come volatile. Il linker non "aggiusta" quel codice, non è il suo lavoro. Non puoi ometterlo. –