Condividi tramite


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:

alloc_text

auto_inline

bss_seg

check_stack

code_seg

comment

component

conform1

const_seg

data_seg

deprecated

detect_mismatch

fenv_access

float_control

fp_contract

function

hdrstop

include_alias

init_seg1

inline_depth

inline_recursion

intrinsic

loop1

make_public

managed

message

omp

once

optimize

pack

pointers_to_members1

pop_macro

push_macro

region, endregion

runtime_checks

section

setlocale

strict_gs_check

unmanaged

vtordisp1

warning

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

Vedere anche

Riferimenti

Pragma C

Parole chiave C++

Altre risorse

Riferimenti al preprocessore C/C++