5

を使用するコードの移植性はどの程度#pragma optimizeですか? ほとんどのコンパイラはそれをサポートしていますか? また、これに対するサポートはどの程度完全#pragmaですか?

4

5 に答える 5

11

#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)実装は実装定義の方法で動作します。この動作により、変換が失敗したり、トランスレータまたは結果のプログラムが準拠していない方法で動作したりする可能性があります。実装によって認識されない ものは無視されます。pragmapragma

そして、ここに例があります:

int main () {
    #pragma omp parallel for
    for (int i=0; i<16; ++i) {}
}

C および C++ OpenMP API の大部分は#pragmas として実装されます。

于 2012-11-07T10:29:08.303 に答える
6

各コンパイラには独自の動作があるため、多くの場合、コンパイラ フラグに依存することはお勧めできません。

このフラグは、コードに挿入するコンパイル レベルの仕様であるため、使用しないでください。

通常、理論的には、このフラグを使用しない場合、コンパイラはこのフラグを無視する必要があります。

于 2012-11-07T10:28:01.337 に答える
3

この#pragmaキーワードは、コンパイラーに関係なく常にコンパイルする必要があるという意味で移植性があります。ただし、プラグマはコンパイラ固有であるため、コンパイラを変更すると、いくつかの警告が表示される可能性があります。OpenMP のプラグマなど、一部のプラグマは広く使用されています。コードを可能な限り移植性の高いものにするために、使用しているコンパイラに応じて、プラグマを#ifdef/で囲むことができます。#endif例えば:

#ifdef __ICC
   #pragma optimize
#endif

__ICCコンパイラは通常、どのコンパイラが使用されているかをコードに知らせるマクロなどを定義します。

于 2012-11-07T10:43:51.183 に答える
1

#pragmaはポータブルではありません。それが遭遇するたびにゲームを開始するために使用されるgccのバージョンがありました

私たちが職場で使用しているコンパイラのうち、2 つは確実に をサポートしておらず#pragma optimise、残りについてはお答えできません。

仮にそうしたとしても、最適化のためのコマンド ライン スイッチが異なるため、プラグマのオプションが異なる可能性があります。

于 2012-11-07T10:31:12.587 に答える
1

の使用#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でサポートされていますが、将来サポートされるという意味ではありません。

于 2012-11-07T10:32:35.180 に答える