Ответ 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.