C++(およびC)では、基本的に実装定義の効果を持つ#pragma
という指令があります。しかし、指示が何をする可能性があるのか何らかの限界がありますか? (私は標準ではない本当のコンパイラは、実際に何をすべきかについて、可能にするかについて尋ねてることに注意してください。)標準では#pragmaに何ができるのですか?
を#pragma
が行うことができます私は確信している:
- は、いくつかのコンパイルオプションのいずれかを選択できるようにしましたすべての結果が有効なC++になります。たとえば、利用可能ないくつかのABIのいずれかを選択するか、特定の実装定義オプションを切り替えます。
は、コンパイラが診断を発行することなく、それ以外の場合は、不正なコードを受け入れることを許可する(例えば、コンパイラが構築された新しいをサポートすることを決定するかもしれません:私は推測することは許されますが、確認していないされて
-inタイプ
long long long
が、それは診断を発行する必要があります使用して、任意のコード;。この診断は、その後、例えば#pragma long long long
を抑制することができ コンパイラは、そうでない場合は法的なコードを拒否することを許可するには、例えばがあるかもしれませんこれにより、コンパイラは、安全でないと考えられる特定のライブラリ関数および/または言語構成の使用をエラーとしてフラグを立てる。
私が実際に疑問許可されていますが、わからないのいずれか:
- コンパイラは異なるものに法的なコードの意味を変更することを許可する(例えば、コンパイラベンダがそれを考えられていると仮定
for
条件があっ事後条件(while
を...do
のように)、それに応じてfor
の意味を切り替える#pragma for postcondion
を定義した場合、良いアイデア。
私が後者を疑うのは、コンパイラが認識できないプラグマを無視できるということです。そのため、プラグマによるセマンティクスの変更によって、同じプログラムが異なるコンパイラで異なるセマンティクスを持つようになります。
しかし、標準では実際に何が許可されていますか?許可されているものの、上のリストでカバーされていないものはありますか?
私は長く長いものは許されないと思う: '#pragma'はコンパイラによって無視されるかもしれない。 –
@Alexandre確かに、しかし、私は彼が与えた例のためにそれがどのように問題であるか見ることができません。コンパイラが 'long long long'をサポートしていれば、その使用時に出された警告を抑止する' #pragma'もサポートします。さらに、これはもっと一般的な警告抑制プラグマとどのように違うのですか? –