Вопрос объявления переменной - PullRequest
2 голосов
/ 17 сентября 2010

В моем коде есть следующее объявление:

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 они используют его так же, как я хотел. Этот код глючит?


Одно окончательное обновление, если я использую следующий код:

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

Это говорит мне, что он пытается применить атрибут к обеим переменным. Я собираюсь придерживаться идеи, что это не зависит от типов атрибутов.

Ответы [ 3 ]

4 голосов
/ 17 сентября 2010
Квалификатор

volatile является общей частью всей декларации. * является частью индивидуального декларатора. Так

u32 volatile *A, *B;

эквивалентно

u32 volatile *A;
u32 volatile *B;

Это то, что говорится в спецификации языка.

Однако __attribute__ не является частью языка, а это означает, что вы должны обратиться к документации вашего компилятора, чтобы выяснить, как он себя ведет.

3 голосов
/ 17 сентября 2010

Это зависит от используемого компилятора и значения __attribute__((nocast)) для него. Заметьте, это не стандартная буква C.

В любом случае разумно защитить себя от двусмысленности, просто написав декларации отдельно для каждой переменной.

1 голос
/ 17 сентября 2010

~ Вы можете проверить это и увидеть, но я бы не хотел писать код, который зависел от этого.Другим читателям будет непонятно, вы можете забыть, как это так, или, поскольку это расширение в любом случае, оно может измениться или может быть сделано по-разному различными поставщиками компиляторов, которые пытаются предложить этот синтаксис (компилятор Linux linux C / C ++, llvm, и несколько других компиляторов используют этот синтаксис, который возник из GCC (я верю}).

Вам, вероятно, следует использовать typedef или другую строку для каждого, чтобы быть ясным и уверенным в этом.

Если вы работаете над написанием другого компилятора и хотите сопоставить синтаксис с каким-то ~ стандартным ~, ваш лучший ресурс будет запрашивать список разработчиков gcc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...