Frage zu struct



  • Hi,

    ich habe ein Problem, nachfolgende Ausschnitt ist mir unklar:

    meineheader.h beinhaltet folgende Einträge

    EINTRAG_NUMMER(0,     0,     16,   8) // Kommentar
    EINTRAG_NUMMER(0,     0,     14,   8) // Kommentar
    EINTRAG_NUMMER(5,     0,     13,   8) // Kommentar
    EINTRAG_NUMMER(0,     0,     17,   8) // Kommentar
    EINTRAG_NUMMER(0,     0,     16,   8) // Kommentar
    EINTRAG_NUMMER(0,     0,     18,   8) // Kommentar
    

    in meine_C_datei.c finde ich folgende Struktur:

    #define EINTRAG_NUMMER(a,b,c,d)  a,b,c,d
    
    static const struct FORMAT_vom_EINTRAG mein_Struktur_Array[] {
    
    #include "meineheader.h"
    
    5,0,0,5         //letzter Eintrag
    };
    

    wobei gilt:

    struct FORMAT_vom_EINTRAG{
        char i;
        char j;
        char k;
        char l;
    };
    

    Offensichtlich wird "EINTRAG_NUMMER(a,b,c,d)" durch "a,b,c,d" ersetzt.
    Ein Rätsel ist mir allerdings wie anhand dieser Dateiinkludierung der Kompiler direkt den Eintrag aus der Header in die Struktur schreibt.

    Hab das bislang weder in einem Lehrbuch noch an anderer Stelle gesehen. Vielleicht ist jemand damit vertraut und kann es mir erklären.

    Vielen Dank
    Grüße



  • Der Compiler bekommt davon gar nichts mit - das erledigt alles der Präprozesor. Der ersetzt (1) die Zeile #include "meineheader.h" durch den Inhalt des Headers und (2) alle Vorkommen von EINTRAG_NUMMER durch die entsprechende Makro-Ersetzung. Also sieht dein Compiler das da:

    static const struct FORMAT_vom_EINTRAG meine_Struktur {
    
    0,0,16,8
    0,0,14,8
    5,0,13,8
    0,0,17,8
    0,0,18,8
    
    5,0,0,8
    }
    

    (wobei ich mich allerdings vermute, daß du entweder im Header oder im #define ein Komma unterschlagen hast)



  • Hey,

    Danke, du hast recht ich habe tatsächlich ein Komma unterschlagen und zwar nach dem "d" bei der Präprozessor direktive.

    Mir geht es um die include Datei, ich mein, vorher soll der Präprozessor wissen, dass er die include Anweisung scheinbar mit den Konstaten aus meineheader.h auffüllen soll. Es ist ja nicht der einizgste Eintrag in der Header, also woher weiß der Präprozessor das er just die richtige Einträge nimmt. An der Stelle im Strukt ist ja nur der include Eintrag.

    *ratlos*

    Grüße



  • Der präprozessor geht deinen Quelltext zeilenweise durch (von oben nach unten). Als erstes entdeckt der den #define (und merkt ihn sich), danach die #include-Anweisung - an der Stelle kopiert er den Inhalt des Headers dort rein und arbeitet weiter, als Zwischenschritt hat er dann:

    #define EINTRAG_NUMMER(a,b,c,d)  a,b,c,d,
    
    static const struct FORMAT_vom_EINTRAG mein_Struktur_Array[] {
    
    EINTRAG_NUMMER(0,     0,     16,   8) // Kommentar
    EINTRAG_NUMMER(0,     0,     14,   8) // Kommentar
    EINTRAG_NUMMER(5,     0,     13,   8) // Kommentar
    EINTRAG_NUMMER(0,     0,     17,   8) // Kommentar
    EINTRAG_NUMMER(0,     0,     16,   8) // Kommentar
    EINTRAG_NUMMER(0,     0,     18,   8) // Kommentar
    
    5,0,0,5         //letzter Eintrag
    };
    

    Als nächstes findet er den Bezeichner EINTRAG_NUMMER in (der neuen) Zeile 5 und ersetzt ihn durch den Ersatztext, den er dazu noriert hat. Indem er das selbe in den folgenden Zeilen macht, entsteht der endgültige Code, den ich oben gepostet habe - und den bekommt dann der Compiler vorgesetzt.



  • Hi,
    nun geht mir ein licht auf, dass er die header an diese stelle kopiert, war mich nicht klar. vielen dank

    Aber WAS geschieht, wenn du nun mehrer Einträge in der Header hast.
    Soweit ist das verstanden habe, kopiert wird der komplette Inhalt an die Stelle kopiert.

    Oder werden anderen Einträge verworfen, da sie nicht in die Struktur "passen"???

    Grüße



  • Der Präprozessor kümmert sich überhaupt nicht um die interne Struktur deiner Programme - für den ist das nur ein Haufen ASCII-Zeichen, die er auf Textniveau umformen kann. Und einen #include"..." ersetzt er wirklich durch den gesamten Inhalt des angegebenen Headers - im günstigsten Fall meckert hinterher der Compiler, daß dort etwas nicht in die Array-Deklaration reinpasst (netterweise geben die meisten Compiler bei ihren Fehlermeldungen die Position im Original-Quelltext an).

    (im ungünstigsten Fall versucht der Compiler, die unpassenden Einträge irgendwie in deine Struktur reinzuquetschen)



  • hmmm,
    verstehe, also auf dauer eine eher "gefährliche" Sache(!), wenn ein anderer Benutzer nicht weiß und wie die header an anderer Stelle genutzt wird und dieser die Header erweitert.

    Vielen Dank für deine Erläuterung, du hast mir sehr geholfen.

    Viele Grüße


Anmelden zum Antworten