__attribute__是否适用于声明中的所有变量?

jbl*_*jbl 32 c gcc

__attribute__指令是否适用于在一行上声明的所有成员?


int a, b, c;
Run Code Online (Sandbox Code Playgroud)

声明三个int变量.


int *a, b, c;
Run Code Online (Sandbox Code Playgroud)

声明变量"a"作为指向int的指针,b和c声明为int.


int __attribute__((used)) a, b, c;
Run Code Online (Sandbox Code Playgroud)

used属性是应用于所有变量还是仅适用于a

Yu *_*Hao 28

来自GCC:属性语法:

在使用单个说明符和限定符列表的多个标识符的声明中,以逗号分隔的声明符列表中的声明符(不是第一个)之前可以出现属性说明符列表.这些属性说明符仅适用于它们出现在其声明符之前的标识符.例如,在

__attribute__((noreturn)) void d0 (void),
     __attribute__((format(printf, 1, 2))) d1 (const char *, ...),
      d2 (void);
Run Code Online (Sandbox Code Playgroud)

noreturn属性适用于声明的所有函数; format属性仅适用于d1.

根据这个,在你的例子中:

int __attribute__((used)) a, b, c;
Run Code Online (Sandbox Code Playgroud)

该属性仅适用于a.

但如果是:

__attribute__((used)) int a, b, c;
Run Code Online (Sandbox Code Playgroud)

该属性适用于所有a,bc.

  • 结论是错误的;`__attribute__ int var` 和 `int __attribute__ var` 之间没有区别,因为“var”不是“除了第一个之外的”。 (2认同)

oua*_*uah 8

gcc文档(6.36属性语法)说它只适用于它们出现在其声明符之前的标识符:

在使用单个说明符和限定符列表的多个标识符的声明中,以逗号分隔的声明符列表中的声明符(不是第一个)之前可以出现属性说明符列表.这些属性说明符仅适用于它们出现在其声明符之前的标识符.例如,在

__attribute__((noreturn)) void d0 (void),
     __attribute__((format(printf, 1, 2))) d1 (const char *, ...),
      d2 (void);
Run Code Online (Sandbox Code Playgroud)

所以在你的例子中:

int __attribute__((used)) a, b, c;
Run Code Online (Sandbox Code Playgroud)

该属性仅适用于a.