Допустим, мы определяем две структуры в C или C++ (я получаю одинаковый результат как в C, так и в C++, и я думаю, что правила одинаковы, скажите, если они не являются).
один с элементом значения неполного типа:
struct abc{
int data;
struct nonexsitnow next; //error: field ‘next has incomplete type, makes sense since "struct nonexsitnow" hasn't been declared or defined.
};
и один с указательным элементом неполного типа:
struct abc{
int data;
struct nonexsitnow *next; //pass?!
};
Почему второе определение не вызывает никаких проблем? Он использует struct nonexsitnow
который не был создан!
ОБНОВИТЬ:
Я завершаю этот лист из ответов и комментариев ниже, надеясь, что они будут правы и полезны для разработки.
Как отметил @ArneVogel, обе struct Foo p;
и struct Foo *p;
является неявным объявлением Foo
и struct Foo;
явно делает эту работу (спасибо @Джон Боллинджер). Это почти ничего не значит для c, но имеет значение для c++ и поведения:
In a situation where struct Foo is:
_______________________________________________________
| | undeclared | declared but | defined |
| | | not defined | |
-------------------------------------------------------
| | C | C++ | C | C++ | C | C++ |
-------------------------------------------------------
|struct Foo p; | × | × | × | × | √ | √ |
|struct Foo* p; | √ | √ | √ | √ | √ | √ |
| Foo p; | × | × | × | × | × | √ |
| Foo* p; | × | × | × | √ | × | √ |