処理系定義の動作の制御
処理系定義の動作は #pragma
指令によって制御されます。
目次 |
[編集]構文
#pragma pragma_params | (1) | ||||||||
_Pragma ( string-literal) | (2) | (C99以上) | |||||||
\"
を "
で、 \\
を \
で置き換え、結果を (翻訳ステージ3で行われるように) トークン化し、そしてその結果を (1) の #pragma
への入力として使用します。[編集]説明
プラグマ指令は、コンパイラの警告の無効化やアライメント要件の変更など、コンパイラの処理系固有の動作を制御します。 認識されないあらゆるプラグマは無視されます。
[編集]標準のプラグマ
以下の3つのプラグマが言語標準によって定義されています。
#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
です。ノート: プラグマをサポートしないコンパイラが、例えば 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 |
[編集]参考文献
- C11 standard (ISO/IEC 9899:2011):
- 6.10.9 Pragma operator (p: 178)
- C99 standard (ISO/IEC 9899:1999):
- 6.10.6 Pragma directive (p: 159)
- C89/C90 standard (ISO/IEC 9899:1990):
- 3.8.6 Pragma directive
[編集]関連項目
処理系定義の動作の制御 の C++リファレンス |
[編集]外部リンク
- C++ pragmas in Visual Studio 2010
- 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
- HP aCC compiler pragmas