プラグマのディレクティブと __Pragma のキーワード
プラグマ ディレクティブは、マシンまたは操作に固有のコンパイラ機能を指定します。__pragma 、Microsoft のコンパイラに固有であり、キーワードを使用すると、コードのプラグマ ディレクティブでマクロ定義をします。
#pragma token-string
__pragma(token-string)
解説
C および C++ の各実装は、ホスト コンピューターまたはオペレーティング システムに固有のいくつかの機能をサポートしています。一部のプログラムは正確なコントロールのデータが格納されるメモリ領域または特定の関数にパラメーターが表示される方法を制御するなどの練習する必要があります。#pragmaディレクティブの各コンパイラは、C および C++ 言語の全体的な互換性を維持しながら、コンピューターおよびオペレーティング システムに固有の機能を提供する手段を提供します。
プラグマはマシンやオペレーティング システムに固有であると定義され、すべてのコンパイラは、通常、異なるです。プラグマは条件付きステートメントでは、プリプロセッサの新機能を提供するために、または、コンパイラ実装で定義された情報を提供するために使用できます。
token-stringは、特定のコンパイラ命令および引数では、一連の文字が存在する場合です。シャープ記号 (#) プラグマを含む行の最初の空白以外の文字でなければなりません。 空白文字はシャープ記号と単語「プラグマ」を分割できます。次の#pragma、トークンの前処理として、翻訳者が解析できる任意のテキストを記述します。引数#pragmaマクロの展開されることです。
コンパイラが認識できないプラグマが検出されると、警告メッセージが表示し、コンパイルを続行します。
Microsoft C および C++ のコンパイラは、次のプラグマを認識します。
loop1 |
||
1.C コンパイラによってのみをサポートします。
プラグマ、コンパイラのオプション
一部のプラグマはコンパイラ オプションと同じ機能を提供します。ソース コードで、プラグマが見つかると、コンパイラのオプションで指定された動作より優先されます。たとえば、指定した /Zp8、このコンパイラ設定を使用してコードの特定のセクションをオーバーライドすることができます パック。
cl /Zp8 ...
<file> - packing is 8
// ...
#pragma pack(push, 1) - packing is now 1
// ...
#pragma pack(pop) - packing is 8
</file>
__Pragma() キーワード
マイクロソフトの特定
コンパイラもサポートしています、 __pragmaと同じ機能を持つキーワードとして、 #pragmaディレクティブが使われるインライン マクロの定義内で指定できます。#pragmaディレクティブに、ディレクティブのシャープ記号 ('#') コンパイラを解釈するため、マクロ定義で使用できません、 演算子 (#) を文字列。
次のコード例に示します、 __pragmaマクロで、キーワードを使用できます。このコードは、mfcdual.h ヘッダーの ACDUAL サンプルでは、「コンパイラ 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; \
特定の Microsoft を終了します。