我一直认为是这样,但许多 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(举一个明显的例子)改为使用_asm
关键字,但语法完全不同(汇编语言用大括号括起来而不是字符串文字)。
否 - 内联 asm 是一种常见的扩展,但不是标准的(并且经常由不同的供应商以不同的方式实现)。