(SOLVED) C2143 und C4430

Dein Thema passt einfach in kein Forum? Dann probiers mal hier.
Antworten
lespaul
Beiträge: 87
Registriert: 11. August 2011 10:07

(SOLVED) C2143 und C4430

Beitrag 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
Zuletzt geändert von lespaul am 10. Oktober 2011 10:22, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: C2143 und C4430

Beitrag von Christian81 »

[n]Minimal kompilierbares[/b] Beispiel bitte ...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
brax
Beiträge: 208
Registriert: 11. Mai 2010 11:22

Re: C2143 und C4430

Beitrag 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
lespaul
Beiträge: 87
Registriert: 11. August 2011 10:07

Re: C2143 und C4430

Beitrag 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? )
Dateianhänge
Test.zip
(2.63 KiB) 502-mal heruntergeladen
brax
Beiträge: 208
Registriert: 11. Mai 2010 11:22

Re: C2143 und C4430

Beitrag 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...
lespaul
Beiträge: 87
Registriert: 11. August 2011 10:07

Re: C2143 und C4430

Beitrag 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?
lespaul
Beiträge: 87
Registriert: 11. August 2011 10:07

Re: C2143 und C4430

Beitrag von lespaul »

Hab im Header Vorwärtsdeklariert und in den Sourcen included. Fehler is WECH.. Thnx Brax!
Antworten