Selbstdefinierte Dateitypen in Header



  • evtl

    struct EigenerDateityp *funktion();
    


  • volkard schrieb:

    ja. schrieb:

    ja, halt ein typedf. da stimmt schon alles.
    ist ein struct.

    Kannste mal alle beteiligten Dateien zeigen? Dann tue ich die bei mir in den Compiler und finde sicher den Fehler.

    naja ich poste hier ungern richtigen code. das oben ist halt nur eine "analogie" zu meinem richtigen post.

    aber das ist etwa das gleiche:

    // dateityp.h
    #ifndef DATEITYP_H
    #define DATEITYP_H
    
    typedef struct {
           unsigned int var1;
           unsigned short var2;
           int var3;
           char var4[10];
    } EigenerDateityp;
    
    #endif
    

    stimmt doch so alles, oder?



  • sinnloses gebrabbel schrieb:

    naja ich poste hier ungern richtigen code. das oben ist halt nur eine "analogie" zu meinem richtigen post.

    Klar. Solltes ja nur ein geschrumpftes Beispiel posten.

    Also

    //main.c
    #include <stdio.h>
    #include <stdlib.h>
    
    #include "header.h"
    
    int main()
    {
        printf("Hello world!\n");
        return 0;
    }
    
    // dateityp.h
    #ifndef DATEITYP_H
    #define DATEITYP_H
    
    typedef struct {
           unsigned int var1;
           unsigned short var2;
           int var3;
           char var4[10];
    } EigenerDateityp;
    
    #endif
    
    // header.c
    #include "header.h"
    #include "dateityp.h" // hier ist EigenerDateityp definiert
    
    EigenerDateityp *funktion()
    {
    
    }
    
    // header.h
    #ifndef HEADER_H
    #define HEADER_H
    
    #include "dateityp.h"
    
    EigenerDateityp *funktion();
    
    #endif
    

    compiliert bei mir.

    edit: SInd 4 Dateien, hab sie der EInfachheit zusammenkopiert nur zum Posten.



  • Die Standard-Includes vom Compiler sind auch in der C-Standard-library abgelegt.
    Und die wird automatisch dazu gebunden.

    Ist das DATEITYP_H auch beides mal gleich geschrieben?



  • ja, DATEITYP_H ist richtig geschrieben.

    bei mir kompiliert mein richtiger quellcode nicht, es gibt fehlermeldungen ala:
    `C:\Users\ICH\AppData\Local\Temp\cc8meMcu.o:test.c:(.rdata+0x4): first defined h

    ere`

    ich verstehs nicht...

    in der main.c inkludiere ich beide dateien:

    // main.c anfang
    #include <stdio.h>
    #include "dateityp.h"
    #include "header.h"
    
    int main()
    // ...
    

    ??????



  • Zyklische Inkludierungen?
    Oder haste irgendwo eine *.c inkludiert?



  • volkard schrieb:

    Zyklische Includierungen?

    😕

    erklärung bitte?

    was genau meinst du?

    ich brauche die datei "header.h" in der main, sonst kann ich ja die funktionen aus der nicht benutzen.

    und wenn ich "dateityp.h" entferne, gibt es den fehler immernoch. es liegt also nicht daran.



  • nein, überall .h

    der quelltext ist, soweit ich das grad beurteilen kann, einwandfrei.

    ich hab das problem übrigens öfter. bisher noch nicht herausgefunden, woran das liegt.



  • geht nicht... schrieb:

    ja, DATEITYP_H ist richtig geschrieben.

    bei mir kompiliert mein richtiger quellcode nicht, es gibt fehlermeldungen ala:

    Headerdateien umbenennen und zwei neue erstellen. Den Code kompilierfähig machen und dann Stück für Stück die Headerdateien neu aufbauen und kompilieren, bis du auf die Fehlerursache triffst.



  • also laut der compilermeldung liegt es an einem string, der angeblich mehrmals definiert wurde. das ist aber falsch, es gibt nur einen string im ganzen quelltext mit diesem namen.

    also ich muss schon sagen... die compilermeldung könnte etwas aufschlussreicher sein!



  • p.s.: wenn ich den string auskommentiere, lässt es sich kompilieren. wenn ich den string umbennene, dann besteht das problem weiterhin!!!



  • nachtrag schrieb:

    also laut der compilermeldung liegt es an einem string, der angeblich mehrmals definiert wurde. das ist aber falsch, es gibt nur einen string im ganzen quelltext mit diesem namen.

    also ich muss schon sagen... die compilermeldung könnte etwas aufschlussreicher sein!

    String in einem Header definiert? SOllte auch nicht. Dort nur als extern anmelden. Und in der *.c definieren.



  • nachtrag schrieb:

    also ich muss schon sagen... die compilermeldung könnte etwas aufschlussreicher sein!

    Jo, da sagste was.
    Hatte früher saugerne dazu mehrere Compiler installiert, damit ich von den verschiedenen Compilern die Fehlermeldungen anschauen konnte.
    Borland war hilfreich meistens.
    Microsoft war kacke meistens.
    gcc war damals noch indiskutabel.
    (edit: Ist heute eher andersrum. Aber egal, wenn das Programm auf mehreren Compilern geht, frag immer mal einen anderen bei häßlichen Problemen. Ok, hätte hier jetzt auch nicht geholfen.)



  • jetzt geht es! danke! 😃

    dass man strings nicht in headern definieren soll wusste ich garnicht.

    gilt das generell? dass man typedefs, bzw. andere globale variablen nicht im header definiereh soll?



  • -- ok -- schrieb:

    jetzt geht es! danke! 😃

    dass man strings nicht in headern definieren soll wusste ich garnicht.

    gilt das generell? dass man typedefs, bzw. andere globale variablen nicht im header definiereh soll?

    One Definition Rule! (google dann mal danach)

    Darfst immer nur einmal definieren.
    Die typedefs und den Schmodder deklarierst Du ja nur. Das darfste so oft wie Du kannst.
    Naja, ist es wenig seltsam und dann doch noch zwei oder drei unlogische Ausnahmen. Gute Annahme ist: Darfst nur einmal Speicher belegen für einen Bezeichner, also so Speicher, der dann in die Exe-Datei wandert. Wie Funktionscode, gobaler String-Inhalt, globale Variable.



  • ok, und gibt es eine Möglichkeit, dass die *.c dateien beim kompilieren nicht mit angegeben werden können? gibts da irgendwelche compiler-direktiven oder sowas?

    gcc irgwendwas.c nochmalwas.c header.c main.c -o header.exe

    ich würde aber gerne sowas haben:
    gcc main.c -o header.exe



  • letzte frage schrieb:

    ich würde aber gerne sowas haben:
    gcc main.c -o header.exe

    Nee, kann nicht.
    Du solltest Dir entweder eine Batch schreiben, die Deine Dateuien compiliert,

    oder ein Makefile machen.
    Unter Linux, BSD oder so ist ein Makefile echt angemessen und auch total einfach schnell gemacht.
    Musst nur immer die Dateien, die Du neu anlegst, dann auch immer da einpflegen.

    Erstmal. Später kannste auch sehr schlaue makefiles benutzen, die die *.c-Dateien selber finden.

    Tuts erstmal

    gcc *.c -o header.exe
    

    ?



  • gut danke für deine antworten.


Anmelden zum Antworten