内联asm是ANSI C标准的一部分吗
Is inline asm part of the ANSI C standard?
我一直认为是这样,但许多IDE和语法突出显示工具并不突出显示C中的ASM,但它们总是使用C++。内联装配是否是C标准(ANSII或ISO)的一部分?
它不在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声明;它的意义在于实现-定义
也就是说,"有条件支持"意味着你根本不能依赖于支持它的特定编译器。微软(举一个明显的例子)使用了_asm
关键字,但语法完全不同(汇编语言用大括号括起来,而不是字符串文字)。
无内联asm是一个常见的扩展,但不是标准的(不同的供应商通常会以不同的方式实现)。
相关文章:
- C++11 标准中的哪一部分规定了基元数据类型大小之间的相对顺序?
- 从另一个常量标准::映射初始化一个常量标准::映射的一部分
- 为什么std :: nullopt_t的一部分是C 标准的一部分
- 标准的哪一部分决定了现场成员与初始化器列表的优先级
- 虚拟表是C++标准的一部分吗?
- C 标准的哪一部分涵盖通过空指针调用方法
- fabsf 是 C++11 中标准命名空间的一部分吗?
- 内联asm是ANSI C标准的一部分吗
- C 标准的哪一部分要求set ::擦除呼叫灾难源
- 是标准的一部分
- 模板类方法不会导致错误——这是标准的一部分
- strcpy_s是C++标准的一部分吗?或者只是MS Visual C++的一部分
- 模板模板模板参数是扩展还是标准的一部分
- 线程是标准C++的一部分
- "polymorphic base class"是C++标准的一部分吗?
- 值初始化是 C++98 标准的一部分吗?如果不是,为什么在 C++03 标准中添加它
- wcslen 是 ISO/IEC 14882:2003 C++标准库的一部分吗?
- #import C++11 标准的一部分
- boost Range库将成为下一个c++标准的一部分吗?
- 模板模板参数何时成为标准的一部分?