In C++ (e C) abbiamo la direttiva #pragma
che ha fondamentalmente effetti di implementazione definiti. Tuttavia, ci sono dei limiti a ciò che la direttiva può fare? (Si noti che sto chiedendo ciò che la norma consente, non su ciò che i compilatori reali effettivamente fare.)Che cosa consente lo standard #pragma?
Quello che sto certo #pragma
può fare:
- permettono di selezionare una delle diverse opzioni di compilazione che tutto porta a C++ valido. Ad esempio, seleziona uno dei vari ABI disponibili o cambia alcune opzioni di implementazione definite.
Quello che immagino è consentito, ma non sono sicuro:
Lasciare che il compilatore di accettare il codice altrimenti illegale senza l'emissione di un diagnostico (per esempio, un compilatore potrebbe decidere di sostenere un nuovo built -in tipo
long long long
, ma qualsiasi codice che utilizza che avrebbe dovuto emettere un diagnostico;. questa diagnostica potrebbe quindi essere soppresso con ad esempio#pragma long long long
Consentire al compilatore di rifiutare il codice altrimenti legale, per esempio ci potrebbe essere un
#pragma strict
che induce il compilatore a segnalare come errore l'uso di alcune funzioni di libreria e/o costrutti di linguaggio considerati non sicuri.
Quello che realmente dubbio è consentito, ma non sono sicuro che sia:
- Lasciare che il compilatore di modificare la semantica di codice legale per qualcosa di diverso (per esempio, si supponga che un fornitore del compilatore ha ritenuto una buona idea se la condizione
for
fosse una postcondizione (come indo
...while
), e definito#pragma for postcondion
per commutare il senso difor
conseguenza.
Il motivo per cui dubito di quest'ultimo è che al compilatore è permesso di ignorare qualsiasi pragma che non riconosce, e quindi un cambiamento di semantica da parte di un pragma farebbe sì che lo stesso programma abbia semantica diversa su diversi compilatori.
Tuttavia, cosa consente effettivamente lo standard? E ci sono cose che sono permesse, ma che non sono coperte dalla mia lista sopra?
Dubito che le lunghe cose lunghe siano consentite: '# pragma' può essere ignorato dai compilatori comunque. –
@Alexandre Certo, ma non riesco a vedere come questo è un problema per l'esempio che ha dato. Se il compilatore supportava 'long long long', supportava anche' # pragma' che sopprimeva l'avviso emesso al momento del suo utilizzo. Inoltre, come è diverso da un pragma di soppressione degli avvertimenti più generico? –