Что это за декларация? - программирование
Подтвердить что ты не робот

Что это за декларация?

Из этого question

Мне трудно понять этот код.

struct foo myfoo;  // --> Is it forward declaration or object creation. ?

struct foo
{
 int a;
};

int main()
{

return 0;
}

В коде, помеченном стрелкой --> Является ли это объявлением или созданием объекта.

Если это объявление вперед, то что называется struct foo;? Если это создание или создание объекта, то как он может создать объект перед определением структуры.

В gcc компилятор работает нормально, но другой компилятор дает ошибку.

gcc -Werror -Wall tst.c -o tst

Любое предложение или объяснение этого поведения gcc? Я не мог найти нигде, как задокументировано.

4b9b3361

Ответ 1

Похоже на предварительное определение myfoo, и поскольку определение структуры предоставляется, вы не получаете ошибки.

clang предоставляет всестороннюю диагностику, если тип не определен.

[email protected]:~$ cat tst.c
struct foo myfoo;

//struct foo{
//  int x ;
//} ;

int main()
{
}
[email protected]:~$ clang tst.c
tst.c:1:12: error: tentative definition has type 'struct foo' that is never
      completed
struct foo myfoo;

Я не думаю, что его ошибка gcc, clang, а также goau online компилирует код.

$6.9.2/2

Объявление идентификатора для объекта, который имеет область действия без инициализатора, и    без спецификатора класса хранения или со спецификатором класса хранения static, представляет собой       предварительное определение. Если единица перевода содержит одно или несколько предварительных определений для          идентификатор, а единица перевода не содержит внешнего определения для этого идентификатора, то               поведение точно такое же, как если бы единица перевода содержала объявление области видимости файла                идентификатор с составным типом на конце блока перевода с инициализатором                 равным 0.


Ответ 2

 struct foo myfoo; 

Это определение переменной C типа foo, называемое myfoo. C требует, чтобы вы явно указывали struct перед объявлениями переменных struct.

Теперь ваш код не должен компилироваться, потому что компилятор понятия не имеет о том месте, где вы определили свой myfoo, какой тип foo выглядит. Компилятор должен жаловаться на foo как неполный тип.

EDIT:

Отбросьте это, это будет называться предварительное определение.