Seite 1 von 1

(SOLVED) C2143 und C4430

Verfasst: 7. Oktober 2011 14:03
von lespaul
Hallo,

ich habe eine Klasse SpecialDevice. Unter anderem habe ich dort ein Zeiger deklariert auf ein SpecialModule-Objekt im Header Zeile 116.

Code: Alles auswählen

#include "SpecialModule.h" 
//..
SpecialModule *pSpecialModule;
Wenn ich die .cpp Dateien in meinem Projekt einzeln Kompiliere, bekomme ich success, kein Fehler. Wenn ich das Projekt kompiliere bekomme ich:

Code: Alles auswählen

1>c:\Path\Project\SpecialDevice.h(116) : error C2143: syntax error : missing ';' before '*'
1>c:\Path\Project\SpecialDevice.h(116) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\Path\Project\SpecialDevice.h(116) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
Wenn ich den obigen Zeiger nicht im Header, sondern zB in einer Methode im SpecialDevice.cpp deklariere und definiere:

Code: Alles auswählen

SpecialModule *pSpecialModule = new SpecialModule();
funktioniert es auch..

Weiss jemand Rat?

Ich danke!

Gruß LesPaul

Re: C2143 und C4430

Verfasst: 7. Oktober 2011 14:18
von Christian81
[n]Minimal kompilierbares[/b] Beispiel bitte ...

Re: C2143 und C4430

Verfasst: 7. Oktober 2011 15:03
von brax
Auch wenn ich mir natürlich nicht sicher sein kann, weil dafür, wie Christian81 ja schon geschrieben hat, die relevanten Informationen fehlen, sieht das nach einem rekursiven Include aus, also zwei Header, die sich gegenseitig includieren. Dann bekommt man vom cl (aus den Ausgaben schließe ich mal, dass Du im Visual Studio arbeitest) genau diesen Fehler.

Tipp: in SpecialDevice.h ist das #include "SpecialModule.h" unnötig. Eine forward declaration reicht völlig.

hth

Re: C2143 und C4430

Verfasst: 7. Oktober 2011 15:47
von lespaul
Anbei 4 Sourcen und 3 Header. Habe alles weggekürzt. Minimalkompilierbar ist es allerdings nicht, da mein Fehler ja noch da ist.
Es sind Sourcen für ein Qt-VS-Projekt.

@brax: Ja das könnte es sein. Ich check es mal gleich..

( Was

Code: Alles auswählen

class AClass;
ist eine Vorwärtsdeklaration. Ok hab ich verstanden, aber was ist der Unterschied zum includen? )

Re: C2143 und C4430

Verfasst: 7. Oktober 2011 15:57
von brax
Durch die Vorwärtdeklaration sagst Du dem quasi Compiler nur, dass es eine Klasse mit dem Namen gibt. Da im Header nur ein Pointer auf ein Objekt dieser Klasse benutzt wird, braucht der Compiler auch gar nicht mehr darüber zu wissen. Erst wenn das Objekt, auf den der Pointer zeigt, wirklich benutzt wird, wird die eigentliche Definition gebraucht, daher muss dann natürlich das include in die cpp.

Ein include ist nichts anderes als eine textuelle Einsetzung. Der Preprozessor fügt einfach den Inhalt der Datei dort ein. Darum auch das Problem, wenn sich zwei Dateien gegenseitig includieren (quasi eine Rekursion ohne Abbruchbedingung).

Ein wesentlicher Vorteil von Vorwärtsdeklarationen (abgesehen davon, dass sich so zyklische Abhängigkeiten machen lassen), ist dass Deine Header voneinander entkoppelt werden. Das hat einen wesentlichen Einfluß auf die Kompilierdauer. Bei kleinen Projekten ist das egal, bei größeren Sachen mit einigen tausend Klassen willst du aber, dass bei einer Änderung an einem Header so wenig wie möglich neu gebaut werden muss. Daher soweit Möglich in Headern eher Vorwärtsdeklarationen benutzen!

P.S.: CDockWidget.h inkludiert "Tcp_Server.h" und andersrum...

Re: C2143 und C4430

Verfasst: 10. Oktober 2011 09:16
von lespaul
Morgen Leute,

beim #includen kann ich ja die Datei in <eckige_Klammern> angeben oder in "Gänsefüßchen" je nachdem ob bei additional Include folders oder im aktuellen Ordner gesucht werden soll. Wie ist das dann bei Vorwärstdeklarationen?

Weiterhin habe ich das mit Vorwärtsdeklarationen versucht:
1>..\Cmod_1.cpp(136) : error C2027: use of undefined type 'SpecialObject'
brax hat geschrieben:Durch die Vorwärtdeklaration sagst Du dem quasi Compiler nur, dass es eine Klasse mit dem Namen gibt. Da im Header nur ein Pointer auf ein Objekt dieser Klasse benutzt wird, braucht der Compiler auch gar nicht mehr darüber zu wissen. Erst wenn das Objekt, auf den der Pointer zeigt, wirklich benutzt wird, wird die eigentliche Definition gebraucht, daher muss dann natürlich das include in die cpp.
Achsoo, also im Header Vorwärtsdeklaration und gleichzeitig in dessen Source die #include?

Re: C2143 und C4430

Verfasst: 10. Oktober 2011 10:21
von lespaul
Hab im Header Vorwärtsdeklariert und in den Sourcen included. Fehler is WECH.. Thnx Brax!