プラグマ ディレクティブと __Pragma キーワードPragma Directives and the __Pragma Keyword

プラグマ ディレクティブは、コンピューター固有またはオペレーティング システム固有のコンパイラ機能を指定します。Pragma directives specify machine- or operating-specific compiler features. _ _Pragmaマクロ定義内のプラグマ ディレクティブをコードには、Microsoft コンパイラに固有で、キーワードを使用します。The __pragma keyword, which is specific to the Microsoft compiler, enables you to code pragma directives within macro definitions.

構文Syntax

#pragma token-string
__pragma(token-string)

RemarksRemarks

C および C++ の各実装は、そのホスト コンピューターまたはオペレーティング システムに固有の機能をいくつかサポートしています。Each implementation of C and C++ supports some features unique to its host machine or operating system. たとえば、一部のプログラムは、データが格納されているメモリ領域、または特定の関数がパラメーターを受け取る方法を正確に制御する必要があります。Some programs, for example, must exercise precise control over the memory areas where data is put or to control the way certain functions receive parameters. #Pragmaディレクティブは、各コンパイラが C および C++ 言語の全体的な互換性を維持しながらマシンとオペレーティング システムに固有の機能を提供するための手段を提供します。The #pragma directives offer a way for each compiler to offer machine- and operating system-specific features while retaining overall compatibility with the C and C++ languages.

プラグマは、コンピューター固有つまりオペレーティング システム固有であり、通常はコンパイラごとに異なります。Pragmas are machine- or operating system-specific by definition, and are usually different for every compiler. プラグマは、新しいプリプロセッサ機能を提供するために、または実装定義の情報をコンパイラに提供するために、条件付きステートメントで使用できます。Pragmas can be used in conditional statements, to provide new preprocessor functionality, or to provide implementation-defined information to the compiler.

token-string は、特定のコンパイラ命令と引数 (ある場合) を渡す一連の文字です。The token-string is a series of characters that gives a specific compiler instruction and arguments, if any. シャープ記号 (#) 最初の空白以外の文字にする必要があります、プラグマを格納している行には空白文字がシャープ記号と単語「pragma」に分離できます。The number sign (#) must be the first non-white-space character on the line that contains the pragma; white-space characters can separate the number sign and the word "pragma". 次の #pragma、翻訳者は、プリプロセス トークンとして解析できる任意のテキストを記述します。Following #pragma, write any text that the translator can parse as preprocessing tokens. 引数に #pragmaマクロの展開される可能性があります。The argument to #pragma is subject to macro expansion.

コンパイラで認識されないプラグマが検出されると、警告が表示され、コンパイルは続行されます。If the compiler finds a pragma that it does not recognize, it issues a warning and continues compilation.

Microsoft C および C++ コンパイラは、次のプラグマを認識します。The Microsoft C and C++ compilers recognize the following pragmas:

alloc_textalloc_text auto_inlineauto_inline bss_segbss_seg
check_stackcheck_stack code_segcode_seg commentcomment
componentcomponent conform 1conform 1 const_segconst_seg
data_segdata_seg deprecateddeprecated detect_mismatchdetect_mismatch
fenv_accessfenv_access float_controlfloat_control fp_contractfp_contract
functionfunction hdrstophdrstop include_aliasinclude_alias
init_seg 1init_seg 1 inline_depthinline_depth inline_recursioninline_recursion
intrinsicintrinsic loop 1loop 1 make_publicmake_public
managedmanaged messagemessage
ompomp onceonce
optimizeoptimize packpack pointers_to_members 1pointers_to_members 1
pop_macropop_macro push_macropush_macro region、endregionregion, endregion
runtime_checksruntime_checks sectionsection setlocalesetlocale
strict_gs_checkstrict_gs_check unmanagedunmanaged vtordisp 1vtordisp 1
warningwarning

1 C++ コンパイラでのみサポートされています。1 Supported only by the C++ compiler.

プラグマとコンパイラのオプションPragmas and Compiler Options

一部のプラグマの機能はコンパイラ オプションのものと同じです。Some pragmas provide the same functionality as compiler options. ソース コード内のプラグマは、コンパイラ オプションで指定された動作をオーバーライドします。When a pragma is encountered in source code, it overrides the behavior specified by the compiler option. たとえば、指定した、/zp8 ですを使用してコードの特定のセクションのコンパイラ設定をオーバーライドできますパック:For example, if you specified /Zp8, you can override this compiler setting for specific sections of the code with pack:

cl /Zp8 ...

<file> - packing is 8
// ...
#pragma pack(push, 1) - packing is now 1
// ...
#pragma pack(pop) - packing is 8
</file>

__pragma() キーワードThe __pragma() Keyword

Microsoft 固有の仕様Microsoft specific

コンパイラもサポートしています、 _ _pragmaキーワードは、同じ機能として、 #pragmaディレクティブ、インライン マクロ定義で使用できますが、します。The compiler also supports the __pragma keyword, which has the same functionality as the #pragma directive, but can be used inline in a macro definition. #Pragmaディレクティブ、コンパイラ ディレクティブのシャープ記号 ('#') の解釈されるので、マクロ定義では使用できません、文字列化演算子 (#)します。The #pragma directive cannot be used in a macro definition because the compiler interprets the number sign character ('#') in the directive to be the stringizing operator (#).

コード例を次に示しますが、どのように _ _pragmaマクロでキーワードを使用できます。The following code example demonstrates how the __pragma keyword can be used in a macro. このコードは、「コンパイラ COM サポートのサンプル」の ACDUAL サンプルの mfcdual.h ヘッダーからの抜粋です。This code is excerpted from the mfcdual.h header in the ACDUAL sample in "Compiler COM Support Samples":

#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; \

End Microsoft 固有の仕様End Microsoft specific

関連項目See also

C/C++ プリプロセッサ リファレンスC/C++ Preprocessor Reference
C プラグマC Pragmas
キーワードKeywords