Direktivy Pragma a klíčové slovo __Pragma
Direktivy Pragma určují funkce kompilátoru závislé na počítači nebo operačním systému.Klíčové slovo __pragma, které je specifické pro kompilátor společnosti Microsoft, umožňuje kódovat direktivy pragma v rámci definice maker.
#pragma token-string
__pragma(token-string)
Poznámky
Každá implementace jazyka C a C++ podporuje některé funkce, které jsou jedinečné pro daný hostitelský počítač nebo operační systém.Některé programy musí například vykonávat přesnou kontrolu paměťových oblastí pro ukládání dat, nebo způsob, jak některé funkce přijímají parametry.Direktivy #pragma představují způsob, jakým každý kompilátor nabízí funkce závislé na počítači a operačním systému při zachování celkové kompatibility s jazyky C a C++.
Pragma jsou závislé na počítači nebo operačním systému a obvykle se různí pro každý kompilátor.Pragma lze použít jako podmíněné příkazy a poskytnout tak preprocesoru nové funkce, nebo poskytnout kompilátoru informace definované implementací.
token-string je posloupnost znaků, které poskytuje specifickému kompilátoru instrukce a argumenty, pokud existují.Znak čísla (#) musí být prvním nemezerovým znakem na řádku, který obsahuje pragma; mezerové znaky mohou oddělit znak čísla a slovo „pragma“.Po #pragma napište libovolný text, který dokáže překladač analyzovat jako tokeny předzpracování.Argument #pragma se řídí podle rozšíření makra.
Pokud kompilátor najde pragma, které nebylo rozpoznáno, upozorní a pokračuje v kompilaci.
Kompilátory Microsoft C a C++ rozpoznají následující Pragma:
1.Podporováno pouze v kompilátoru jazyka C++.
Pragma a možnosti kompilátoru
Některé prvky pragma poskytují stejné funkce, jaké poskytují možnosti kompilátoru.Pokud se pragma vyskytne ve zdrojovém kódu, potlačí chování určené jinou možností kompilátoru.Například, pokud jste zadali /Zp8, můžete přepsat toto nastavení kompilátoru pro určité části kódu pomocí pack:
cl /Zp8 ...
<file> - packing is 8
// ...
#pragma pack(push, 1) - packing is now 1
// ...
#pragma pack(pop) - packing is 8
</file>
Klíčové slovo __pragma()
Specifické pro Microsoft
Kompilátor podporuje také klíčové slovo __pragma, které má stejnou funkci, jako direktiva #pragma, ale které lze používat vložené v definici makra.Direktivu #pragma nelze použít v definici makra, protože kompilátor interpretuje znaménko pro číslo ('#') v direktivě, jako operátor pro definici řetězce (#).
Následující příklad kódu ukazuje, jak lze klíčové slovo __pragma použít v makru.Tento kód je výňatkem z hlavičky mfcdual.h ve vzorku ACDUAL v "Vzorky podpory kompilátoru COM":
#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; \
Specifické pro End Microsoft