“asm宏”是标准C的一部分吗?

3

我们开发嵌入式PowerPC架构的代码。

我们的编译器支持一种称为asm宏的东西。

以下是手册的摘录:

asm Macro Syntax

An asm macro definition looks much like a function definition, including a return type and parameter list, and function body.

The syntax is:

asm [volatile] [return-type] macro-name ( [ parameter-list ] )
 {
 % storage-mode-list (must start in column 1)
 ! register-list     (“!” must be first non-whitespace)
   asm-code      
 } (must start in column 1

这是标准C吗?我的编译器手册上没有将此列为扩展。

在第一个答案之后澄清:

我知道 { } 中的部分不是标准C所定义的。我指的是在 asm 之后、闭合)之前结构类似函数的内容。


1
请参见 https://dev59.com/mGzXa4cB1Zd3GeqPPhGm - D Krueger
2个回答

4
不,它不是标准的 C 语言。任何与特定架构相关的内容(比如汇编代码)都会被定义为实现特异性扩展。

1
哦,抱歉,也许我应该表达得更准确。我知道 {汇编或类似语言} 中的部分不是标准 C 定义的。我指的是整个类似函数的结构。 - RedX
不,关于那个问题也没有任何标准。 - Carl Norum

0

asm 关键字在 C 中不是标准的,它在 C++ 中被预留了,但无论哪种情况下语法都是与实现相关的,如 此处 所述:

asm-declaration 为向 C++ 程序嵌入汇编语言源代码提供了可能。该声明是有条件支持和实现定义的,这意味着它可能不存在,并且即使由实现提供,它也没有固定的含义。

然而,它用于定义宏对我来说是新颖而有趣的。


C++中的语法不是实现定义的。标准(C++03 7.4)规定了内联汇编的实际语法为asm "NOP";,没有其他内容。实现定义的部分仅限于引号内的实际汇编代码,本例中为NOP指令。 - Lundin
@Lundin:说得好,但是那个定义的语法并没有涵盖问题中的语法,也没有涵盖GCC中的输入/输出/破坏规范语法,历史上很少有标准化——我的建议是期望编译器会有所不同。VC++使用了一个由__asm引入的不同语法,这是非标准编译器扩展的更正确形式。 - Clifford

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接