我的代码中有以下声明:
u32 volatile __attribute__((nocast)) *A, *B;
这相当于:
u32 volatile __attribute__((nocast)) *A;
u32 volatile __attribute__((nocast)) *B;
或:
u32 volatile __attribute__((nocast)) *A;
u32 volatile *B;
甚至:
u32 volatile __attribute__((nocast)) *A;
u32 *B;
这是一个小小的更新。它是linux内核代码,因此唯一可能的编译器是gcc。我知道我可能最终会在多行上写这个,但我很好奇。
例如,在以下linux kernel code中,他们使用它与我想要的方式类似。那个代码有问题吗?
最后一次更新,如果我使用以下代码:
int main() {
int __attribute__((weak)) a, b;
}
我在gcc下面收到以下警告:
foo.c: In function ‘main’:
foo.c:5: error: weak declaration of ‘a’ must be public
foo.c:5: error: weak declaration of ‘b’ must be public
这告诉我它正在尝试将属性应用于这两个变量。我打算运行它不会因属性类型而异。
答案 0 :(得分:4)
volatile
限定符是整个声明的共同部分。 *
是个人声明者的一部分。所以
u32 volatile *A, *B;
相当于
u32 volatile *A;
u32 volatile *B;
这就是语言规范所说的。
但是,__attribute__
不是该语言的一部分,这意味着您必须查阅编译器文档以了解其行为。
答案 1 :(得分:3)
这取决于您使用的编译器以及__attribute__((nocast))
对它的含义。请注意,这不是标准C。
在任何情况下,通过简单地为每个变量单独编写声明来保护自己免受歧义是明智的。
答案 2 :(得分:1)
〜你可以测试它并查看,但我不想编写依赖于它的代码。其他读者不清楚,你可能会忘记它是哪种方式,或者因为它是一个扩展,无论如何它可能会改变,或者可能由尝试提供这种语法的不同编译器供应商以不同的方式完成(英特尔的Linux C / C ++编译器) ,llvm和其他一些编译器使用源自GCC {I believe}}的语法。
你应该使用typedef或不同的行来清楚并确定这一点。
如果您正在编写另一个编译器,并希望将语法与某些〜标准匹配〜您的最佳资源将会询问gcc开发人员列表。