Tak jak wspomniał adrian17, typ musi być kompletny przed deklaracją obiektu tego typu. Wyjątkowe są zaś wskaźniki, które mogą wskazywać na typy niekompletne. Dlaczego niby? Wskaźnik zawsze ma ten sam rozmiar, a jedyną informacją, którą potrzebuje kompilator przy jego tworzeniu, to przynależność wskaźnika do danego typu. Pozostałe informacje, takie jak rozmiar czy zawartość typu, nie są już mu potrzebne.