Direttive pragma e parola chiave __Pragma
Le direttive pragma specificano funzionalità del compilatore specifiche del computer o del sistema operativo. La parola chiave __pragma, che è specifica del compilatore Microsoft, consente di codificare direttive pragma all'interno delle definizioni di macro.
#pragma token-string
__pragma(token-string)
Note
Ogni implementazione di C e C++ supporta alcune funzionalità esclusive del computer host o del sistema operativo di utilizzo. Alcuni programmi, ad esempio, devono esercitare un controllo preciso sulle aree di memoria in cui i dati vengono immessi o controllare il modo in cui alcune funzioni ricevono i parametri. Le direttive #pragma offrono un metodo con cui ogni compilatore può fornire le funzionalità specifiche del sistema operativo e del computer mantenendo la compatibilità generale con i linguaggi C e C++.
I pragma sono per definizione specifici del computer o del sistema operativo e, in genere, sono diversi per ogni compilatore. I pragma possono essere utilizzati nelle istruzioni condizionali, per fornire nuove funzionalità del preprocessore o per fornire al compilatore informazioni definite dall'implementazione.
La stringa token-string è una serie di caratteri che fornisce a un compilatore specifico eventuali istruzioni e argomenti. Il simbolo di cancelletto (#) deve essere il primo carattere diverso da uno spazio vuoto sulla riga che contiene il pragma; i caratteri di spazio vuoto possono separare il simbolo di cancelletto dalla parola "pragma". Qualsiasi testo che il convertitore può analizzare come token di pre-elaborazione, deve essere scritto dopo #pragma. L'argomento di #pragma è soggetto all'espansione di macro.
Se il compilatore rileva un pragma che non riconosce, genera un messaggio di avviso e continua la compilazione.
I compilatori Microsoft C e C++ riconoscono i seguenti pragma:
loop1 |
||
1. Supportato solo dal compilatore C++.
Opzioni relative a compilatore e pragma
Alcuni pragma offrono la stessa funzionalità delle opzioni del compilatore. Quando viene rilevato un pragma nel codice sorgente, viene eseguito l'override del comportamento specificato dall'opzione del compilatore. Ad esempio, se è stato specificato /Zp8, è possibile eseguire l'override di tale impostazione del compilatore per alcune sezioni specifiche del codice con pack:
cl /Zp8 ...
<file> - packing is 8
// ...
#pragma pack(push, 1) - packing is now 1
// ...
#pragma pack(pop) - packing is 8
</file>
Parola chiave __pragma()
Specifica di Microsoft
Il compilatore supporta inoltre la parola chiave __pragma, che ha la stessa funzionalità della direttiva #pragma, ma può essere utilizzata inline in una definizione di macro. La direttiva #pragma non può essere utilizzata in una definizione di macro, perché il compilatore interpreta il carattere segno di cancelletto ("#") presente nella direttiva come un operatore per la creazione di stringhe (#).
Nell'esempio di codice riportato di seguito viene illustrato come può essere utilizzata la parola chiave __pragma in una macro. Questo codice è stato estratto dall'intestazione mfcdual.h presente nell'esempio ACDUAL in "Esempi di supporto COM per il compilatore":
#define CATCH_ALL_DUAL \
CATCH(COleException, e) \
{ \
_hr = e->m_sc; \
} \
AND_CATCH_ALL(e) \
{ \
__pragma(warning(push)) \
__pragma(warning(disable:6246)) /*disable _ctlState prefast warning*/ \
AFX_MANAGE_STATE(pThis->m_pModuleState); \
__pragma(warning(pop)) \
_hr = DualHandleException(_riidSource, e); \
} \
END_CATCH_ALL \
return _hr; \
Fine sezione specifica di Microsoft