プラグマ ディレクティブと __pragma キーワードPragma directives and the __pragma keyword

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

構文Syntax

#pragma トークン-文字列#pragma token-string
__pragma ( トークン文字列 )__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 location of data in memory, or 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 maintaining overall compatibility with the C and C++ languages.

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

トークン文字列は、特定のコンパイラ命令と引数 (存在する場合) を与える一連の文字です。The token-string is a series of characters that gives a specific compiler instruction and arguments, if any. シャープ記号 ( # ) は、プラグマを含む行の最初の空白以外の文字である必要があります。The number sign (#) must be the first non-white-space character on the line that contains the pragma. 空白文字は、シャープ記号と "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.

コンパイラは、認識できないプラグマを検出してコンパイルを続行すると、警告を発行します。The compiler issues a warning when it finds a pragma that it doesn't recognize, 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 非推奨deprecated 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を指定した場合、次のコードの特定のセクションについて、このコンパイラ設定をpackでオーバーライドできます。For example, if you specified /Zp8, you can override this compiler setting for specific sections of the code with pack:

cl /Zp8 some_file.cpp
// some_file.cpp - packing is 8
// ...
#pragma pack(push, 1) - packing is now 1
// ...
#pragma pack(pop) - packing is 8 again
// ...

__Pragma () キーワードThe __pragma() keyword

コンパイラは、 #pragmaディレクティブと同じ機能を持つ、Microsoft 固有の __pragmaキーワードもサポートしています。The compiler also supports the Microsoft-specific __pragma keyword, which has the same functionality as the #pragma directive. 違いは、 __pragmaキーワードはマクロ定義でインラインで使用できることです。The difference is, the __pragma keyword is usable inline in a macro definition. #Pragmaディレクティブはマクロ定義では使用できません。コンパイラは、ディレクティブのシャープ記号文字 (' # ') を文字列化演算子 (#)として解釈するためです。The #pragma directive isn't usable in a macro definition, because the compiler interprets the number sign character ('#') in the directive as 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; \

参照See also

C/C++プリプロセッサ参照C/C++ preprocessor reference
C プラグマC pragmas
キーワードKeywords