2010-09-17 144 views
2

我在我的代码如下声明:变量声明的问题

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 

这是说,我认为它试图以应用属性到两个变量。我将运行它的想法,它不会改变属性类型。

+1

我不知道那是否意味着其他读代码的人可能不会。为什么不只是长时间打字并摆脱歧义。 – 2010-09-17 17:15:39

+1

或使用typedef ... – 2010-09-17 17:18:30

+0

@Paul R - 你可以在'typedef'中使用'__attribute__'吗? – detly 2010-09-17 17:26:09

回答

4

volatile限定符是整个声明的通用部分。 *是个别声明的一部分。所以

u32 volatile *A, *B; 

相当于

u32 volatile *A; 
u32 volatile *B; 

这是语言规范的话。

但是,__attribute__不是该语言的一部分,这意味着您必须查阅您的编译器文档以了解其行为。

3

这取决于你使用的编译器和__attribute__((nocast))对它的意义。这不是标准的C,介意你。

无论如何,谨慎的做法是通过简单地为每个变量分别写入声明来保护自己免于歧义。

+0

+1如果对如何解释代码存在任何疑问,只需以非歧义形式重新编写代码即可。 – bta 2010-09-17 17:32:09

1

〜您可以测试它并查看,但我不想编写依赖于该代码的代码。其他读者不清楚,你可能会忘记它是哪种方式,或者因为它是一个扩展,它可能会改变,或者可能由不同的编译器供应商以不同的方式完成,这些供应商试图提供这种语法(intel的linux C/C++编译器,llvm和其他一些编译器使用这种源自GCC的语法{我相信})。

你可能应该使用typedef或不同的行来清楚并确定这一点。

如果您正在编写另一个编译器,并希望将语法与〜标准匹配,那么您的最佳资源将要求gcc开发人员列表。

+0

我真的不知道如何测试它。我正在网上查看,看看我是否可以让gcc打印出字符串的类型名称,但我找不到任何东西。 – 2010-09-17 18:37:02