を使用するコードの移植性はどの程度#pragma optimize
ですか? ほとんどのコンパイラはそれをサポートしていますか? また、これに対するサポートはどの程度完全#pragma
ですか?
5 に答える
#pragma
は、コンパイラが認可されておらず、移植性のない言語拡張機能を追加するための認可された移植可能な方法です*。
基本的に、確かなことはわかりません。少なくとも 1 つの主要な C++ コンパイラ (g++) は、このプラグマをそのままサポートしていません。
* :
C++ 標準 (N3242) から:
16.6 プラグマ指令[cpp.pragma]
フォームの前処理ディレクティブ
# pragma
pp-tokens opt改行実装が実装定義の方法で動作するようにします。この動作により、変換が失敗したり、トランスレータまたは結果のプログラムが非準拠の方法で動作したりする可能性があります。実装によって認識されないプラグマは無視されます。
C 標準から (委員会草案 — 2011 年 4 月 12 日):
6.10.6 プラグマ指令
セマンティクス
フォームの前処理ディレクティブ
# pragma
pp-tokens opt改行前処理トークンがディレクティブの直後 (マクロ置換の前) に
STDC
続かない場合、 174)実装は実装定義の方法で動作します。この動作により、変換が失敗したり、トランスレータまたは結果のプログラムが準拠していない方法で動作したりする可能性があります。実装によって認識されない ものは無視されます。pragma
pragma
そして、ここに例があります:
int main () {
#pragma omp parallel for
for (int i=0; i<16; ++i) {}
}
C および C++ OpenMP API の大部分は#pragma
s として実装されます。
各コンパイラには独自の動作があるため、多くの場合、コンパイラ フラグに依存することはお勧めできません。
このフラグは、コードに挿入するコンパイル レベルの仕様であるため、使用しないでください。
通常、理論的には、このフラグを使用しない場合、コンパイラはこのフラグを無視する必要があります。
この#pragma
キーワードは、コンパイラーに関係なく常にコンパイルする必要があるという意味で移植性があります。ただし、プラグマはコンパイラ固有であるため、コンパイラを変更すると、いくつかの警告が表示される可能性があります。OpenMP のプラグマなど、一部のプラグマは広く使用されています。コードを可能な限り移植性の高いものにするために、使用しているコンパイラに応じて、プラグマを#ifdef
/で囲むことができます。#endif
例えば:
#ifdef __ICC
#pragma optimize
#endif
__ICC
コンパイラは通常、どのコンパイラが使用されているかをコードに知らせるマクロなどを定義します。
#pragma
はポータブルではありません。それが遭遇するたびにゲームを開始するために使用されるgccのバージョンがありました
私たちが職場で使用しているコンパイラのうち、2 つは確実に をサポートしておらず#pragma optimise
、残りについてはお答えできません。
仮にそうしたとしても、最適化のためのコマンド ライン スイッチが異なるため、プラグマのオプションが異なる可能性があります。
の使用#pragma
はコンパイラ固有です。
例: GNU、インテル、IBM:
#warning "Do not use ABC, which is deprecated. Use XYZ instead."
マイクロソフト:
#pragma message("Do not use ABC, which is deprecated. Use XYZ instead.")
に関する具体的な質問については、 gccおよびmicrosoft#pragma optimize
でサポートされていますが、将来サポートされるという意味ではありません。