在声明中定位 GCC 属性

Mic*_*nta 6 c gcc

GCC 编译器是否关心我们将属性语句放在声明中的位置?例如,以下是等效的:

void foobar (void) __attribute__ ((section ("bar")));

__attribute__ ((section ("bar"))) void foobar (void);
Run Code Online (Sandbox Code Playgroud)

我在这里看到它们的使用方式没有约定。有时在声明之前,有时在声明之后。

Jen*_*ens -1

这取决于什么类型的声明符应受该属性的约束。

摘自https://gcc.gnu.org/onlinedocs/gcc/Attribute-Syntax.html#Attribute-Syntax

标签属性

在 GNU C 中,属性说明符列表可能出现在标签后面的冒号之后,而不是 case 或 default 标签。如果属性说明符后紧跟分号(即标签适用于空语句),GNU C++ 仅允许标签上的属性。如果缺少分号,则 C++ 标签属性不明确,因为允许以属性列表开头的声明在 C++ 中进行标记。声明不能在 C90 或 C99 中标记,因此不会出现歧义。

枚举器属性

在 GNU C 中,属性说明符列表可以作为枚举器的一部分出现。该属性位于枚举常量之后,=(如果存在)之前。枚举器中的可选属性属于枚举常量。无法将该属性放置在常量表达式(如果存在)之后。

语句属性

在 GNU C 中,属性说明符列表可能作为 null 语句的一部分出现。该属性位于分号之前。

...