5

gccでコンパイルされたCコードvolatileとの違いは何ですか?__volatile__

__asm__ __volatile__Linuxのソースコードを調べていたところ、ある場所では他の場所で使用されasm volatile、他の場所では使用されていることに気づきました__asm__ volatile

私は他のさまざまな場所で使用されているのを見てきましたが、__volatile__なしで使用されているのを見たことがありません。__asm__volatile

__volatile__何をするのか、何をするのか違いはありvolatileますか?もしそうなら、それは何ですか?またはそうでない場合、時々使用される理由が__volatile__ありますか?

4

4 に答える 4

10

これは、レガシー コードとの下位互換性のためだけです。inlinevolatile、などの後世に C に追加されたキーワードにはasm、アンダースコアのプレフィックス/サフィックス バージョン ( __inline____asm____volatile__など) があるため、型/関数/変数として装飾されていない名前を既に使用しているレガシー コードでそれらを使用できます。 /なんでもいい。これを制御するコマンド ライン スイッチがあります。これらの新しいキーワードのアンダースコア バージョンのみ-ansiを使用してコンパイルすると、認識されます。gcc -ansi ...

于 2013-01-07T22:10:33.143 に答える
4

なぜなら-ansi

実際の-ansiプログラムでは使用しませんasm(),が、プログラム自体が でビルドされている場合でも、ヘッダーに asm マクロを含める方法が必要-ansiです。( では-ansi、gcc は new キーワードのように厳密な ISO C と競合する拡張機能を含みません。)

には、適切に名前空間が付けられた代替__asm__が必要でしたが、これはシステムモードasmで定義できませんでした。-ansiさて、これは厳密には必要ではありませんでしたが、volatile,which は長い間キーワードでしたが、おそらく慣性によって、誰かが (そして不必要に)__volatile__と一緒に (予約済みのシステム名形式) を作成しましたvolatile。たとえプログラムが合法であったとして-ansiも仕方。

于 2013-01-07T22:19:14.960 に答える
2

Paul Rの応答に加えて;

以下の名前を定義していないとします。

  • asmvolatile言語キーワードです。どうして知っていますか?前後にアンダースコアがないため、languageのキーワードです。

  • _something_(1 つのアンダースコア) は、予約済みのコンパイラキーワード、型、マクロなどです。

  • __asm____volatile__および__whatever_else__(2 つのアンダースコア) は、標準ライブラリのキーワード、マクロなどです。

これを知ることで、将来的に何を意味するのか、何をググればいいのか、それらへの参照がどこにあるのかを知るのに役立ちます。

于 2013-01-07T22:20:33.310 に答える
0

__asm__asmの代替です。同じ意味です。関連情報は GCC ドキュメントで見つけることができます。

volatile と __volatile の場合、12は、「アセンブリ ステートメントを配置した場所で実行する必要がある場合」を意味します。しかし、私は GCC ドキュメント3をブラウズし、そのような説明を見つけることができません。どちらの答えが正しいかわかりません.2で与えられた答えか、ポールR.

于 2014-02-08T07:56:15.807 に答える