私はいつもそう思っていましたが、多くの IDE や構文強調表示ツールは C の ASM を強調表示しませんが、C++ では常に強調表示します。インライン アセンブリは C 標準 (ANSII または ISO) の一部ですか?
3 に答える
それ自体はISO C標準(C2011のn1570ドラフト)にはありませんが、附属書J(共通拡張)で言及されています:
J.5.10 asm キーワード
1 asm キーワードを使用して、アセンブリ言語をトランスレータ出力 (6.8) に直接挿入できます。最も一般的な実装は、次の形式のステートメントによるものです。
asm ( character-string-literal );
附属書 J は参考情報であり、規範的ではないため、実装はインライン アセンブリを提供する必要はありません。しかし、コンパイラが実際に異なる方法で実装しているため、移植性はありませんが、これは広範な拡張機能です。
C++ 標準 (C++11 標準の n3376 ドラフト) では、標準の本文で言及されています。
7.4 asm 宣言[dcl.asm]
1 asm 宣言の形式は次のとおりです。
asm-定義:
asm ( string-literal ) ;
asm 宣言は条件付きでサポートされています。その意味は実装定義です。[ 注: 通常は、実装を介してアセンブラに情報を渡すために使用されます。— エンドノート]
必須ではなく、実装定義の解釈があります。
一般に信じられていることとは反対に、asm
はC++ 標準に含まれていますが、そのサポートは条件付きです。§7.4/1:
asm 宣言の形式は次のとおりです。
asm-定義:
asm ( string-literal ) ;
asm 宣言は条件付きでサポートされています。その意味は実装定義です。
つまり、「条件付きでサポートされる」ということは、これをサポートする特定のコンパイラにまったく依存できないことを意味します。Microsoft (わかりやすい例の 1 つ) は_asm
代わりにキーワードを使用しますが、構文はまったく異なります (アセンブリ言語は文字列リテラルではなく中かっこで囲まれています)。
いいえ - インライン asm は一般的な拡張機能ですが、標準ではありません (そして、異なるベンダーによって異なる方法で実装されることがよくあります)。