代码之家  ›  专栏  ›  技术社区  ›  Bill Lynch

变量声明问题

gcc c
  •  2
  • Bill Lynch  · 技术社区  · 14 年前

    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 kernel code ,他们用的和我想用的一样。那是密码车吗?


    int main() {
        int __attribute__((weak)) a, b;
    }
    

    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
    

    这告诉我它试图将属性应用于两个变量。我将使用这样一个想法,即它不会因属性类型而异。

    3 回复  |  直到 14 年前
        1
  •  4
  •   Bill Lynch    14 年前

    volatile 限定符是整个声明的公共部分。这个 *

    u32 volatile *A, *B;
    

    相当于

    u32 volatile *A;
    u32 volatile *B;
    

    这就是语言规范所说的。

    然而, __attribute__ 不是语言的一部分,这意味着您必须查阅编译器文档以了解它的行为方式。

        2
  •  3
  •   Eli Bendersky    14 年前

    这取决于你使用的编译器和什么 __attribute__((nocast))

        3
  •  1
  •   nategoose    14 年前

    ~你可以试试看,但我不想写依赖于这个的代码。对于其他读者来说,它不清楚,你可能忘记了它是哪种方式,或者因为它是一个扩展,无论如何它可能会改变或者可以由尝试提供这种语法的不同编译器供应商(英特尔的Linux C/C++编译器,LLVM,和其他一些编译器使用GCC {我相信})来执行。

    您可能应该为每一行使用typedef或不同的行来清楚和确定这一点。

    如果您正在编写另一个编译器,并且希望将语法与~standard~匹配,那么最好的资源就是询问gcc开发人员列表。