Typedef struct : redefinition verhindern?



  • Hallo leute,
    ich hab mehrere Header Files, welche anhand von definitionsdaten automatisch generieren lasse. funktioniert wunderbar, das problem ist jetzt das in jeder header die typdefintion

    typedef struct {
    
    	char acTagName[255];
    	unsigned int iByteAdress;
    	unsigned int iType;	
    	char bBit;			//Hi Nibble Type, Low Nibble Bit (only if Type Bit)
    
    } TAGSTRUCTURE;
    

    behinhaltet, wenn nun mehrer header files verwenden werden gibt es ein redfinition error..

    mit #ifndef TAGSTRUCTURE #endif ... wird wohl nich klappen habt ihr ne lösung?



  • Steck das Ding in eine eigene Headerdatei, Include-Guards drum, fertig.



  • ja das wäre die zweite alternative.. es geht also nicht so wie ich es mir vorstelle?



  • BorisDieKlinge schrieb:

    es geht also nicht so wie ich es mir vorstelle?

    Keine Ahnung. Wie stellst du es dir denn vor?



  • na das diese typedef defintion in jeder header steht, aber nur einmal verwendet/definiert wird.. das war meine frage :p



  • Dann musst du jede Definition in einen #ifndef/#define/#endif-Block stecken, mit demselben Präprozessorsymbol.



  • Darf man fragen, wieso das Ding so oft definiert sein soll?



  • weil die headerfiles automatisch generiert werden, und vorher nich definiert ist, wieveil header verwendnet werden...



  • Wenn dem so ist, und diese Struktur allen generierten Headern gemein ist, dann zieh sie doch aus den generierten Headern raus, und packe sie in einen eigenen Header.
    Den bindest Du dann (mit Guards) in die generierten Header ein.



  • Wenn dem so ist, und diese Struktur allen generierten Headern gemein ist, dann zieh sie doch aus den generierten Headern raus, und packe sie in einen eigenen Header.
    Den bindest Du dann (mit Guards) in die generierten Header ein.

    Diese Option ist mir bekannt, aber ich will eine "General" header vermeiden... danke jungs;)



  • BorisDieKlinge schrieb:

    Diese Option ist mir bekannt, aber ich will eine "General" header vermeiden... danke jungs;)

    mir ist aufgefallen, dass viele Leute so etwas vermeiden. Wieso willst du "General" header vermeiden?



  • weil es zu viel aufwand wäre den header generator tool umzubauen;) zeitdruck.. wenn ich mal luft habe.. dann vll.;) 👍



  • Kannst Du nicht noch ein define hinter dem structure machen z.B.
    #define TAGSTRUCTURE_DEFINED

    Und dann alles ine einen #ifdef TAGSTRUCTURE_DEFINED / #endif Block?



  • BorisDieKlinge schrieb:

    weil es zu viel aufwand wäre den header generator tool umzubauen;) zeitdruck.. wenn ich mal luft habe.. dann vll.;) 👍

    ok, das ist ein Argument. Aber du könntest trotzdem dein struct in Guards setzen:

    /* file_one.h automatically generated by generator */
    #ifndef FILE_ONE_H
    #define FILE_ONE_H
    
    /* many things come here */
    
    #ifndef STRUCT_TAGSTRUCTURE
    #define STRUCT_TAGSTRUCTURE
    typedef struct { 
    
        char acTagName[255]; 
        unsigned int iByteAdress; 
        unsigned int iType;    
        char bBit;            //Hi Nibble Type, Low Nibble Bit (only if Type Bit) 
    
    } TAGSTRUCTURE;
    #endif
    
    /* some prototype over here */
    
    #endif
    

    und

    /* file_two.h automatically generated by generator */
    #ifndef FILE_TWO_H
    #define FILE_TWO_H
    
    /* many things come here */
    
    #ifndef STRUCT_TAGSTRUCTURE
    #define STRUCT_TAGSTRUCTURE
    typedef struct { 
    
        char acTagName[255]; 
        unsigned int iByteAdress; 
        unsigned int iType;    
        char bBit;            //Hi Nibble Type, Low Nibble Bit (only if Type Bit) 
    
    } TAGSTRUCTURE;
    #endif
    
    /* some prototype over here */
    
    #endif
    


  • supertux schrieb:

    mir ist aufgefallen, dass viele Leute so etwas vermeiden.

    ein nachteil ist, dass alle c-files neu compiliert werden, wenn man in so'nen header was verändert.
    🙂



  • fricky schrieb:

    supertux schrieb:

    mir ist aufgefallen, dass viele Leute so etwas vermeiden.

    ein nachteil ist, dass alle c-files neu compiliert werden, wenn man in so'nen header was verändert.
    🙂

    ich erkenne darin keinen Nachteil, im Gegensatz. Wenn die Strukur sich ändert, sollten alle C-Dateien, die diese Struktur verwenden neu kompiliert werden. Die Dateien, die diese Sttruktur nicht benötigen, werden auch neu kompiliert, sollten sie aber nicht. Man sollte die Headers so allegemein wie möglich schreiben, dass man sie nur includiert, wenn man sie tatsächlich braucht.


Log in to reply