Problem mit include directive ...
-
hilfe ich krieg gleich nen kollaps mit folgendem code.
ich habe C und C++ Dateien. Um die C-Funktionen verwenden zu koennen habe ich entsprechende praeprozessor directiven mit extern "C" eingefuegt (siehe code-ausschnitt). Nun versuche ich in einem c++ file eine C-Header zu includieren und bekommen fehlermeldungen, die ich ueberhaupt nicht verstehe:C-Header:
#ifndef CTA_TREE_H #define CTA_TREE_H #if defined (__cplusplus) extern "C" { #endif // JS: Aufzaehlungstyp für die Baumelemente typedef enum { CTA_UNDEF, CTA_ROOT, CTA_COMPOSITION, CTA_CLASSIFICATION, CTA_CLASS } elem_type; // JS: Verkettete Liste fuer die Kinder eines CTA-Elements: typedef struct cta_list { struct cta_tree* elem; struct cta_list* next; } cta_list; // JS: Datenstruktur fuer den CTA-Baum (Datenelement und Kinder): typedef struct cta_tree { CTA_ELEM* elem; struct cta_list* childs; } cta_tree; cta_tree* cta_tree_init (cta_tree* tree); cta_tree* cta_tree_setNode (cta_tree* tree, CTA_ELEM* elem); cta_tree* cta_tree_addChild (cta_tree* tree, CTA_ELEM* elem); cta_tree* cta_tree_sortTree (cta_tree* tree); int cta_tree_numbering (cta_tree* tree, int startId, char* input_type); void cta_tree_printTree (cta_tree* tree, FILE* fp); #if defined (__cplusplus) } #endif #endif
C++ Datei mit include-directive:
// ExtractDlg.cpp: Implementierungsdatei // #include "stdafx.h" #include "TestMate_DLG.h" #include "ExtractDlg.h" //#include "stm_extractor.h" #include "cta_tree.h" #include <shlwapi.h> #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif // Hier gehts weiter mit Klassen-Implementierungen ...
Die Fehlermeldung :
------------------------------------------
t:\testmate1.5.2\sourcen\stm2cta1.5.2\vc\cta_tree.h(26) : error C2143: Syntaxfehler : Fehlendes ';' vor '*'
t:\testmate1.5.2\sourcen\stm2cta1.5.2\vc\cta_tree.h(26) : error C2501: 'CTA_ELEM' : Fehlende Speicherklasse oder Typbezeichner
t:\testmate1.5.2\sourcen\stm2cta1.5.2\vc\cta_tree.h(26) : error C2501: 'elem' : Fehlende Speicherklasse oder Typbezeichner
t:\testmate1.5.2\sourcen\stm2cta1.5.2\vc\cta_tree.h(33) : error C2061: Syntaxfehler : Bezeichner 'CTA_ELEM'
t:\testmate1.5.2\sourcen\stm2cta1.5.2\vc\cta_tree.h(35) : error C2061: Syntaxfehler : Bezeichner 'CTA_ELEM'
------------------------------------------
Diese beziehen sich auf das obige C-Header File aber ich verstehe sie ueberhaupt nicht, da syntaktisch alles korrekt ist.Sobald ich die include-directive aus meinem C++ programm rausnehme funzt es super.
Woran kann das liegen ????
PS: ich benutze MVC 6.0 und das Programm ist ne MFC Anwendung, allerdings bezieht sich der fehler denke ich auf eine C++ spezifische Sache, daher mein post hier.
Danke.
-
noch ne zusatzinfo:
die angegebene header-datei hat den namen "cta_tree.h"
-
so helft mir doch bitte
-
OK, wenn du willst:
Es gibt kein CTA_ELEM. Steht aber eigentlich auch i den Fehlermeldungen. Also vorher mal definieren, was das sein soll.
-
ne das is es auch nicht. ich habe mal die header die die typdeklaration von CTA_ELEM enthaelt includiert.
diese sieht wie folgt aus und hat den namen "cta.h"
#ifndef CTA_H #define CTA_H #if defined (__cplusplus) extern "C" { #endif #include "dataport.h" // ------------------------------------------------- // JS: Boolsche Werte // ------------------------------------------------- typedef enum {FALSE, TRUE} CTA_BOOL; // ------------------------------------------------- // JS: element CTA_NODE // ------------------------------------------------- typedef enum { None, Root, Composition, Classification, Class, UserType, Deleted, } CTA_NODE; // ------------------------------------------------- // JS: element CTA_ELEM // ------------------------------------------------- typedef struct CTA_ELEM { int cta_id; /*id for cta-tree*/ int cta_parent_id; /*parend id for cta-tree*/ stm_id statemate_id; /*statemate id*/ char* chart; /*name of statemate chart*/ char* data_type; /*type of Data-Item*/ char* user_type; /*type of User-Type (if exist)*/ char* user_name; /*name of User-Type (if exist)*/ char* id_type; /*type of statemate element*/ char* def_type; /*statemate definition type*/ char* name; /*element name*/ char* unique_name; /*unique-name of Records/Unions*/ char* structure; /*struture of Data-Items/User-Type/Field/Ev/Co*/ char* description; /*short description*/ char* definition; /*definition of Data-Item*/ char* min; /*min-value of an integer*/ char* max; /*max-value of an integer*/ char* bits; /*number of bits,for integer and bit array*/ char* lindex; /*array index,left*/ char* rindex; /*array index,right*/ char* l_bits_index; /*bit-array index,left*/ char* r_bits_index; /*bit-array index,right*/ char* cta_elm; /*type of cta element*/ int selectable; /*Yes:1 or No:0*/ char* belongsto; /*""*/ char* input_type; /* (AU/QP) 250204: Possible Values for Element-Type = {"Input","Output","State"} */ } CTA_ELEM; // ------------------------------------------------- // JS: element CTA_INPUT_INFO // ------------------------------------------------- typedef struct CTA_ACTIVITY { int stm_id; /*statemate id*/ int stm_parent_id; /*statemate parent id*/ int in_num; /*number of inputs */ char* ac_type; /*statemate activity type */ char* name; /*name of the element */ char* unique_name; /*path name of the element */ char* description; /*short description*/ char* chart; /*chart name, where the activity defined */ char* chart_author; /*author name of the chart */ char* chart_version; /*statemate chart version */ char* stm_workarea; /*statmate workarea path */ int cta_id; /*id in cta-tree*/ int cta_parent_id; /*parend id in cta-tree*/ char* cta_elm; /*type of the cta-element */ int selectable; /*"Yes" or "No"*/ char* belongsto; /*""*/ } cta_activity; #if defined (__cplusplus) } #endif #endif
Dann bekomme ich folgende Fehlermeldung, die auch nicht weniger seltsam ist:
Fehler:
------------
t:\testmate1.5.2\sourcen\stm2cta1.5.2\vc\cta.h(15) : error C2059: Syntaxfehler : 'constant'
t:\testmate1.5.2\sourcen\stm2cta1.5.2\vc\cta.h(15) : error C2143: Syntaxfehler : Fehlendes ';' vor '}'
t:\testmate1.5.2\sourcen\stm2cta1.5.2\vc\cta.h(15) : error C2501: 'CTA_BOOL' : Fehlende Speicherklasse oder Typbezeichner
t:\testmate1.5.2\sourcen\stm2cta1.5.2\vc\cta_tree.h(45) : error C2143: Syntaxfehler : Fehlendes ';' vor '}'
t:\testmate1.5.2\sourcen\stm2cta1.5.2\vc\cta_tree.h(45) : error C2143: Syntaxfehler : Fehlendes ';' vor '}'
t:\testmate1.5.2\sourcen\stm2cta1.5.2\vc\cta_tree.h(45) : error C2143: Syntaxfehler : Fehlendes ';' vor '}'
c:\programme\microsoft visual studio\vc98\include\shlwapi.h(37) : error C2143: Syntaxfehler : Fehlendes ';' vor '{'
c:\programme\microsoft visual studio\vc98\include\shlwapi.h(37) : error C2447: Funktionskopf fehlt - Parameterliste im alten Stil?
t:\testmate1.5.2\sourcen\testmatemfc\extractdlg.cpp(110) : error C2065: 'PathFileExistsA' : nichtdeklarierter Bezeichner
-------------Komischerweise kennt der Compiler nun auch die Funktion PathFileExists nicht mehr (siehe letzte zeile der fehlermeldung).
ps:
extractdlg.cpp -> includiert cta_tree.h --> includiert cta.hDa scheint irgendwie was mit dem includen nicht zu klappen oder was anderes stimmt hier nicht aber ich weiss nicht was es sein koennte.
-
ok ich habs raus :).
die include directive muss noch vor stdafx.h includiert werden.
war also doch nicht C++ sondern vielleicht MFC spezifisches problem (keine ahnung warum das so sein muss, wenn jemand das weiss kann ers gerne posten :))trotzdem danke.
gruss
-
also, mit #include setzt du an die stelle wo das #include steht die datei die du hinter #include angibst,also werden definitionen in der includierten datei erst dann gültig,nachdem die datei includet wurde.
ok hier das bsp zur erklärung://bsp1 blub;//fehler #define blub cout<<"Hallo"; blub;//funzt
//bsp2 //header.h #define blub cout<<"Hallo"; //programm.cpp blub;//fehler #include "header.h" blub;//funzt