処理系定義の動作の制御
処理系定義の動作は #pragma
指令によって制御されます。
目次 |
[編集] 構文
#pragma pragma_params
|
(1) | ||||||||
_Pragma ( string-literal )
|
(2) | (C++11以上) | |||||||
L
接頭辞 (もしあれば) 、外側の引用符、および先行/後続のホワイトスペースを除去し、それぞれの \"
を "
で、 \\
を \
で置き換え、結果を (翻訳ステージ3で行われるように) トークン化し、そしてその結果を (1) の #pragma
への入力として使用します。[編集] 説明
プラグマ指令は、コンパイラの警告の無効化やアライメント要件の変更など、コンパイラの処理系固有の動作を制御します。 認識されないあらゆるプラグマは無視されます。
[編集] 非標準のプラグマ
ISO C++ 言語標準はコンパイラにどのようなプラグマのサポートも要求しません。 しかし、複数の処理系によってサポートされている非標準のプラグマがいくつかあります。
[編集] #pragma STDC
ISO C 言語標準は C コンパイラが以下の3つのプラグマをサポートすることを要求します。 いくつかの C++ コンパイラベンダもその C++ フロントエンドにおいて様々な度合いでそれらをサポートしています。
#pragma STDC FENV_ACCESS arg
|
(1) | ||||||||
#pragma STDC FP_CONTRACT arg
|
(2) | ||||||||
#pragma STDC CX_LIMITED_RANGE arg
|
(3) | ||||||||
ただし arg は ON
または OFF
または DEFAULT
のいずれかです。
ON
に設定された場合は、プログラムが浮動小数点環境をアクセスまたは変更することをコンパイラに知らせます。 フラグの確認やモードの変更を補助する最適化 (グローバルな共通部分式の除去やコードの移動、定数の畳み込みなど) が禁止されることを意味します。 デフォルトの値は処理系定義ですが、通常、 OFF
です。ON
です。+v2
) および |x+iy| = √x2
+y2
を使用しても良いことをコンパイラに伝えます。 言い換えると、これらの関数に渡される値の範囲が制限されることをプログラマが保証します。 デフォルトの値は
OFF
です。上記の3つのプラグマのいずれかが、すべての外部宣言の外側または複合文内のすべての明示的な宣言および文の前以外の文脈で現れた場合、プログラムの動作は未定義です。
ノート: コンパイラは、これらのプラグマをサポートしなくても、 gcc の -fcx-limited-range
や -ffp-contract
のように、同等なコンパイル時オプションを提供していることがあります。
[編集] #pragma once
#pragma once は現代的なコンパイラのほとんどでサポートされている非標準のプラグマです。 ヘッダファイルに現れた場合、たとえ同じソースファイルから (直接的または間接的に) 複数回インクルードされても、一度だけ解析されることを表します。
同じヘッダの複数回インクルードを防ぐ標準の手法はインクルードガードを用いることです。
#ifndef LIBRARY_FILENAME_H #define LIBRARY_FILENAME_H // ヘッダの内容 #endif /* LIBRARY_FILENAME_H */
これにより、任意の翻訳単位においてヘッダの最初以外のすべてのインクルードがコンパイルから除外されます。 すべての現代的なコンパイラは、ヘッダファイルがインクルードガードを使用している事実を記録し、そのガードが未だ定義されている限り、再び遭遇してもそのファイルを再解析しません (例えば gcc を参照してください)。
#pragma once を使用すると、上記のヘッダは以下のように書けます。
#pragma once // ヘッダの内容
ヘッダガードと異なり、このプラグマは誤って複数のファイルで同じマクロを使用することを不可能とします。 一方、 #pragma once はファイルシステムレベルの同一性に基づいてファイルを除外するため、プロジェクト内の複数の場所に存在する場合、そのヘッダの複数回インクルードに対して保護することはできません。
[編集] #pragma pack
This section is incomplete Reason: Information should be copied from |
[編集] 関連項目
処理系定義の動作の制御 の C言語リファレンス
|
[編集] 外部リンク
- C++ pragmas in Visual Studio 2015
- Pragmas accepted by GCC 4.9.2
- Individual pragma descriptions and Standard pragmas in IBM AIX XL C 13.1
- Appendix B. Pragmas in Sun Studio 11 C++ User's Guide
- Intel C++ compiler pragmas in version 17.0
- Release nodes (includes pragmas) for HP aCC A.06.25