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.h

    Da 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
    

Anmelden zum Antworten