名前空間
変種
操作

処理系定義の動作の制御

提供: cppreference.com

処理系定義の動作は #pragma 指令によって制御されます。

目次

[編集]構文

#pragmapragma_params (1)
_Pragma(string-literal) (2) (C99以上)
1) 処理系定義の方法で動作します (pragma_params が下に示す標準プラグマのいずれかの場合を除きます)。
2)string-literal からエンコーディングプレフィックス (もしあれば)、外側の引用符、および先行/後続するホワイトスペースを除去し、それぞれの \"" で、 \\\ で置き換え、結果を (翻訳ステージ3で行われるように) トークン化し、そしてその結果を (1)#pragma への入力として使用します。

[編集]説明

プラグマ指令は、コンパイラの警告の無効化やアライメント要件の変更など、コンパイラの処理系固有の動作を制御します。 認識されないあらゆるプラグマは無視されます。

[編集]標準のプラグマ

以下の3つのプラグマが言語標準によって定義されています。

#pragma STDC FENV_ACCESS arg (1)
#pragma STDC FP_CONTRACT arg (2)
#pragma STDC CX_LIMITED_RANGE arg (3)

ただし argONOFFDEFAULT のいずれかです。

1)ON に設定した場合、プログラムが浮動小数点環境へのアクセスや変更を行うことをコンパイラに伝えます。 これはフラグの判定やモードの変更を壊す最適化 (グローバルな共通部分式の除去、コードの移動、定数の畳み込みなど) が禁止されることを意味します。 デフォルトの値は処理系定義 (通常は OFF) です。
2) 浮動小数点式の縮約を許可します。 縮約は、もし式が書かれた通りに正確に評価されたならば観察されるはずの丸め誤差や浮動小数点例外を、省略する最適化です。 例えば (x*y)+ z を単一の融合積和 CPU 命令で実装することを許可します。 デフォルトの値は処理系定義 (通常は ON) です。
3) 複素数の乗算、除算、および絶対値の計算に、単純化された数式 (x+iy)×(u+iv) = (xu-yv)+i(yu+xv)(x+iy)/(u+iv) = [(xu+yv)+i(yu-xv)]/(u2
+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

[編集]参考文献

  • 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++リファレンス

[編集]外部リンク

close