PC erkennt Klassendeklaration statt Definition
-
Hallo,
ich habe für ein (hoffentlich zukünftiges PC-Spiel) ein Paar Exceptionklassen geschrieben, die dann in eine DLL sollten. Dann habe ich noch einen Namespace eingebaut, der alle Fehler beinhaltet. (Ich habe auch die Funktionen mit in den Namespace geschrieben, damit man anhand des Namespaces schon mit der DLL arbeiten kann und theoretisch keine Doku braucht).
Außerdem meint der Computer das meine Klassendefinition eine deklaration ist, k.a. warum.
[edit]Achja, ich wollte erstmal mit DLLS "rumprobieren", bevor ich ernsthaft mit ihnen arbeiten kann, darum hab ich bei den MSGdefinitionen nur kommentare und keinen richtigen Code verwendet[/edit]
//Datei Excepts.h#ifndef EXcEpt #define EXcEpt #ifndef DLL #define DLL __declspec(dllexport) #endif #include "namespaceexcept.h" class DLL Exceptions::Except { public: inline Except(){} virtual inline ~Except(){} virtual void MSG(){} }; class DLL Exceptions::NO_SLIME : public Except { public: NO_SLIME(){} ~NO_SLIME(){} void MSG() { //Sie haben nicht genuegend Schleim } }; class DLL Exceptions::NO_FOOD : public Except { public: NO_FOOD(){} ~NO_FOOD(){} void MSG() { //Sie haben nicht genuegend Nahrung } }; class DLL Exceptions::NO_WOOD : public Except { public: NO_WOOD(){} ~NO_WOOD(){} void MSG() { //Sie haben nicht genuegend Holz } }; class DLL Exceptions::NO_METAL : public Except { public: NO_METAL(){} ~NO_METAL(){} void MSG() { //Sie haben nicht genuegend Metal } }; class DLL Exceptions::NO_GOLD : public Except { public: NO_GOLD(){} ~NO_GOLD(){} void MSG() { //Sie haben nicht genuegend Gold } }; class DLL Exceptions::NO_MANA : public Except { public: NO_MANA(){} ~NO_MANA(){} void MSG() { //Sie haben nicht genuegend Mana } }; class DLL Exceptions::WReady : public Except { public: WReady(){} ~WReady(){} void MSG() { //Einheit bereit } }; class DLL Exceptions::BReady : public Except { public: BReady(){} ~BReady(){} void MSG() { //Gebaeude bereit } }; class DLL Exceptions::Attacked : public Except { public: Attacked(){} ~Attacked(){} void MSG() { //Sie werden angegriffen } }; class DLL Exceptions::Hero_died : public Except { public: inline Hero_died(){} virtual inline ~Hero_died(){} void MSG() { //Ihr Held ist gestorben } }; class DLL Exceptions::Hero_lvlup : public Except { public: Hero_lvlup(){} ~Hero_lvlup(){} void MSG() { //Ihr Held ist einen Level aufgestiegen } }; class DLL Exceptions::WIN : public Except { public: WIN(){} ~WIN(){} void MSG() { //Sie haben gewonnen } }; class DLL Exceptions::LOOSE : public Except { public: LOOSE(){} ~LOOSE(){} void MSG() { //Sie haben verloren } }; #endif//und datei namespaceexcept.h:
#ifndef EXCEPTSname_H_ #define EXCEPTSname_H_ #ifndef DLL #define DLL __declspec(dllexport) #endif #include "Excepts.h" namespace DLL Exceptions{ extern class DLL Except; extern class DLL NO_FOOD; extern class DLL NO_WOOD; extern class DLL NO_METAL; extern class DLL NO_GOLD; extern class DLL NO_SLIME; extern class DLL NO_MANA; extern class DLL WReady; extern class DLL BReady; extern class DLL Attacked; extern class DLL Hero_lvlup; extern class DLL Hero_died; extern class DLL WIN; extern class DLL LOOSE; extern virtual void Except::MSG(); extern void NO_FOOD::MSG(); extern void NO_WOOD::MSG(); extern void NO_SLIME::MSG(); extern void NO_MANA::MSG(); extern void NO_METAL::MSG(); extern void NO_GOLD::MSG(); extern void WReady::MSG(); extern void BReady::MSG(); extern void Attacked::MSG(); extern void Hero_died::MSG(); extern void Hero_lvlup::MSG(); extern void WIN::MSG(); extern void LOOSE::MSG(); } #endifdabei kommen bei mir (WINdoof XP + VC++) ca. 58 Fehler raus.
Kann mir jemand sagen warum??thx
Glamdring
-
und wenn du noch schreibst was für fehler wäre wir alle esser dran... .
-
Hi,
Frage:
extern virtual void Except::MSG(); //und die anderen funktionenWarum machst du dass?
mfg
v R
-
@virtuell Realisticer(Zitat von mir Z. 3, 4 oder 5, siehe oben):
(Ich habe auch die Funktionen mit in den Namespace geschrieben, damit man anhand des Namespaces schon mit der DLL arbeiten kann und theoretisch keine Doku braucht)
Das spuckt VC++ aus:
--------------------Konfiguration: Exceptions - Win32 Debug--------------------
Kompilierung läuft...
Source.cpp
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(8) : error C2653: 'Exceptions' : Keine Klasse oder Namespace
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(9) : error C2079: 'Except' verwendet undefiniertes class 'Exceptions'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(9) : error C2239: Unerwartetes Token '{' nach der Deklaration von 'Except'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(16) : error C2027: Verwendung des undefinierten Typs "Exceptions"
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(9) : Siehe Deklaration von 'Exceptions'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(16) : error C2079: 'NO_SLIME' verwendet undefiniertes class 'Exceptions'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(16) : error C2239: Unerwartetes Token ':' nach der Deklaration von 'NO_SLIME'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(16) : error C2059: Syntaxfehler : 'public'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(27) : error C2027: Verwendung des undefinierten Typs "Exceptions"
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(9) : Siehe Deklaration von 'Exceptions'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(27) : error C2079: 'NO_FOOD' verwendet undefiniertes class 'Exceptions'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(27) : error C2239: Unerwartetes Token ':' nach der Deklaration von 'NO_FOOD'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(27) : error C2059: Syntaxfehler : 'public'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(38) : error C2027: Verwendung des undefinierten Typs "Exceptions"
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(9) : Siehe Deklaration von 'Exceptions'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(38) : error C2079: 'NO_WOOD' verwendet undefiniertes class 'Exceptions'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(38) : error C2239: Unerwartetes Token ':' nach der Deklaration von 'NO_WOOD'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(38) : error C2059: Syntaxfehler : 'public'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(49) : error C2027: Verwendung des undefinierten Typs "Exceptions"
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(9) : Siehe Deklaration von 'Exceptions'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(49) : error C2079: 'NO_METAL' verwendet undefiniertes class 'Exceptions'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(49) : error C2239: Unerwartetes Token ':' nach der Deklaration von 'NO_METAL'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(49) : error C2059: Syntaxfehler : 'public'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(60) : error C2027: Verwendung des undefinierten Typs "Exceptions"
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(9) : Siehe Deklaration von 'Exceptions'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(60) : error C2079: 'NO_GOLD' verwendet undefiniertes class 'Exceptions'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(60) : error C2239: Unerwartetes Token ':' nach der Deklaration von 'NO_GOLD'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(60) : error C2059: Syntaxfehler : 'public'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(71) : error C2027: Verwendung des undefinierten Typs "Exceptions"
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(9) : Siehe Deklaration von 'Exceptions'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(71) : error C2079: 'NO_MANA' verwendet undefiniertes class 'Exceptions'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(71) : error C2239: Unerwartetes Token ':' nach der Deklaration von 'NO_MANA'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(71) : error C2059: Syntaxfehler : 'public'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(82) : error C2027: Verwendung des undefinierten Typs "Exceptions"
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(9) : Siehe Deklaration von 'Exceptions'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(82) : error C2079: 'WReady' verwendet undefiniertes class 'Exceptions'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(82) : error C2239: Unerwartetes Token ':' nach der Deklaration von 'WReady'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(82) : error C2059: Syntaxfehler : 'public'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(93) : error C2027: Verwendung des undefinierten Typs "Exceptions"
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(9) : Siehe Deklaration von 'Exceptions'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(93) : error C2079: 'BReady' verwendet undefiniertes class 'Exceptions'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(93) : error C2239: Unerwartetes Token ':' nach der Deklaration von 'BReady'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(93) : error C2059: Syntaxfehler : 'public'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(104) : error C2027: Verwendung des undefinierten Typs "Exceptions"
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(9) : Siehe Deklaration von 'Exceptions'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(104) : error C2079: 'Attacked' verwendet undefiniertes class 'Exceptions'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(104) : error C2239: Unerwartetes Token ':' nach der Deklaration von 'Attacked'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(104) : error C2059: Syntaxfehler : 'public'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(115) : error C2027: Verwendung des undefinierten Typs "Exceptions"
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(9) : Siehe Deklaration von 'Exceptions'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(115) : error C2079: 'Hero_died' verwendet undefiniertes class 'Exceptions'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(115) : error C2239: Unerwartetes Token ':' nach der Deklaration von 'Hero_died'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(115) : error C2059: Syntaxfehler : 'public'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(126) : error C2027: Verwendung des undefinierten Typs "Exceptions"
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(9) : Siehe Deklaration von 'Exceptions'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(126) : error C2079: 'Hero_lvlup' verwendet undefiniertes class 'Exceptions'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(126) : error C2239: Unerwartetes Token ':' nach der Deklaration von 'Hero_lvlup'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(126) : error C2059: Syntaxfehler : 'public'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(137) : error C2027: Verwendung des undefinierten Typs "Exceptions"
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(9) : Siehe Deklaration von 'Exceptions'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(137) : error C2079: 'WIN' verwendet undefiniertes class 'Exceptions'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(137) : error C2239: Unerwartetes Token ':' nach der Deklaration von 'WIN'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(137) : error C2059: Syntaxfehler : 'public'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(148) : error C2027: Verwendung des undefinierten Typs "Exceptions"
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(9) : Siehe Deklaration von 'Exceptions'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(148) : error C2079: 'LOOSE' verwendet undefiniertes class 'Exceptions'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(148) : error C2239: Unerwartetes Token ':' nach der Deklaration von 'LOOSE'
c:\programme\microsoft visual studio\myprojects\exceptions\excepts.h(148) : error C2059: Syntaxfehler : 'public'
c:\programme\microsoft visual studio\myprojects\exceptions\namespaceexcept.h(7) : error C2059: Syntaxfehler : '__declspec(dllexport ) '
c:\programme\microsoft visual studio\myprojects\exceptions\namespaceexcept.h(7) : error C2143: Syntaxfehler : Fehlendes ';' vor '{'
c:\programme\microsoft visual studio\myprojects\exceptions\namespaceexcept.h(7) : error C2447: Funktionskopf fehlt - Parameterliste im alten Stil?
Fehler beim Ausführen von cl.exe.Exceptions.dll - 58 Fehler, 0 Warnung(en)
Gruß
Glamdring
-
namespace __declspec(dllexport) Exceptions{ }
Ich glaube(!) das __declspec(dllexport) einfach beim namespace nix verloren hat. Nimms mal weg und compilier es neu.
Die namespaces gibt es für den Linker z.B. nicht mehr. Also wirds die auch für ne DLL nicht mehr geben wenn sie verwendet wird.
-
Das entfernen von __declspec(dllexport) verursacht noch mehr Fehler(74) und 14 Warnungen. Aber noch ne kleine Frage, kann man keine Namespaces in DLL Dateien verwenden??? Und gibt es irgendwo ne Anleitung, wie man die DLLs einbindet und auf die DLL - Funktionen zugreift?
thx
Glamdring
-
Hmm...
Was ich grad sehe:
Du inkludierst die Dateien gegenseitig. Das geht nicht.
Lies mal den Beitrag:
http://c-plusplus.net/forum/viewtopic.php?t=4751&highlight=querverweis
das hilft Dir zu verstehen wo das Problem liegt.
-
@ Knuddlbaer: Danke, ich habs verstanden.
Ich hab aber dennoch ein Problem, ich habe den Namespace gelöscht und die Klassen gelassen, wie sie waren. Dann hab ich die DLL erstellt. Jetzt wollte ich das ganze mal anhand einiger Links
(
http://www.mut.de/media/buecher/VCPLUS6/data/kap17.htm
http://www.henkessoft.de/api6.htm
) ausprobieren, ich hab die .LIB-Datei gelinkt, in ein Konsolenprogramm eingebaut und wollte dann in der mainfunktion eine dieser Klassen erstellen(NO_SLIME Ansgar;)aber er findet die Klasse nicht.
Woran kann das liegen(die .LIB-Datei wird scheinbar gelinkt, weil er dazu keinen Fehler bringt)thx
Glamdring
-
denke man kann dir im msvc forum besser helfen, thread verschoben
-
du musst die Headerdatei einbinden, sie ist nur für den compiler und die syntaxprüfung, der linker verknüpft die aufrufe dann mit der dll.
übrigens:
ich habe gelesen, dass Exceptions (mit throw) nicht in einer DLL ausgeführt werden sollen, wenn diese nicht vorher abgefangen d.h innerhalb der DLL.
wobei ich bei MFC nicht sicher bin!
sonst gibt es ein problem
les dir mal das durch:
http://www.c-plusplus.net/forum/viewtopic.php?t=15291&highlight=throw+dlldie suche nach "throw" und "dll" zeigt dir nóch mehr probleme zu diesem thema
-
Sry, wenn ich noch mal dumm naqchfragen muss, aba muss die .h Datei eingebunden werden, mit der die DLL erstellt wurde (wenn ja ist das ja nicht mehr dynamisch und mann müsste bei änderungen der DLL das ganze neu kompilieren).
Zum Thema exceptions muss ich sgaen, dass ich das so verstehe, dass man die Exceptions nur nicht innerhalb der DLL "geschmissen" werden dürfen. Aber die Klassen sollen in einer Exe "geschmissen" werden und sind nur zum erweitern in einer DLL, quasi als zwischenspeicher.
thx
Glamdring
-
die definition in der header datei hat keinerlei code und ist auch nur für den compiler gedacht, damit er weiß was er mit dem benutzten klassenbezeichner anfangen soll.
später nutzt der linker die lib datei um dann auch den code ausführen zu können.throw sollte nicht aus der DLL gehen,
aber wenn throw nicht in der dll ist sollte es funkzen.