1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Deutsch
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

C mehrere Datein includen

  • SBDevil
  • 16. Oktober 2005 um 15:05
  • Unerledigt
  • SBDevil
    2
    SBDevil
    Mitglied
    Punkte
    15
    Beiträge
    2
    • 16. Oktober 2005 um 15:05
    • #1

    Guten Tag,
    Ich hab ein Problem und hoffe jemand kann mir dabei helfen.
    Undzwar möchte ich ein Programm schreiben was aus 2 Datein besteht.
    Eine projekt.c für die Implementierungen und eine projekt.h für die structs definitionen. Meine Funktionen aus der projekt.c möchte ich dann natürlich in meiner main.c benutzen.
    Die Dateien schauen wie folgt aus:

    main.c:
    #include "projekt.c"
    #include "projekt.h"
    int main(){
    test z1,z2,z3;
    ... // malloc auf z1 und z2 und sowas
    z3=zadd(z1,z2);
    }


    projekt.c:
    #inlude "projekt.h"
    test zadd(test s1, test s2){
    test s3;
    ... // malloc auf s3 und sowas
    return s3;
    }


    projekt.h:
    typedef struct Test *test;
    struct Test{
    ...
    };

    Ich hab mir gedacht: da ich in der main.c sowohl die structs als auch die Funktionen benutze, muss ich beide Dateien includen.
    Bei der projekt.c benutz ich auch die structs und muss deswegen die projekt.h includen.
    Jetzt sagt mein Compiler aber: redefinition of 'struct Test'

    Wo ist mein Fehler? Darf ich nich 2 mal die projekt.h includen? Oder woran liegt es?

    Falls mir wer helfen kann wär ich echt dankbar :)
    MfG SBDevil

  • Paulchen
    1
    Paulchen
    Gast
    • 16. Oktober 2005 um 15:34
    • #2

    ich hab zwar selber (noch) so gut wie keine ahnung von c, aber ich glaub, das sollte so funktionieren:

    main.c:

    C
    /* #include "projekt.c"  (ist überflüssig) */
    #include "projekt.h"
    
    
    int main(){
       test z1,z2,z3;
       ... // malloc auf z1 und z2 und sowas
       z3=zadd(z1,z2);
    }


    projekt.c:

    Code
    #inlude "projekt.h"
    test zadd(test s1, test s2) {
       test s3;
       ... // malloc auf s3 und sowas
       return s3;
    }


    projekt.h:

    Code
    test zadd(test s1, test s2);  /* forward declaration */
    
    
    typedef struct Test {
       ...
    } test;


    die dateien projekt.c und main.c separat kompilieren, und die entstehenden object-files dann verlinken. keine ahnung, welchen compiler du verwendest, mit gcc geht das so:

    Code
    gcc -g -c projekt.c
    gcc -g -c main.c
    gcc -g -o main main.o projekt.o


    das programm kannst dann mit

    Code
    ./main


    ausführen.

  • SBDevil
    2
    SBDevil
    Mitglied
    Punkte
    15
    Beiträge
    2
    • 16. Oktober 2005 um 16:49
    • #3

    Jau danke!
    So klappt es wunderbar :)

  • bnd
    4
    bnd
    Mitglied
    Punkte
    170
    Beiträge
    31
    • 16. Oktober 2005 um 21:24
    • #4

    Du sollst in jeder Header Datei Preprozessor Direktiven analog zu folgendem Beispiel drin haben:

    #ifndef HEADER_H
    #define HEADER_H
    .
    .
    .
    #endif // HEADER_H


    HEADER ist durch den Namen der jeweiligen Datei zu ersetzen.

    András

    The mainframes are dead, long live the mainframes!
    http://jedi.informatik.uni-leipzig.de/index.html

  • davewood
    17
    davewood
    Mitglied
    Reaktionen
    9
    Punkte
    3.204
    Beiträge
    536
    • 16. Oktober 2005 um 22:03
    • #5

    das hat naemlich folgenden sinn, wurde eine datei bereits irgendwo schonmal inkludiert, so wird sie nicht nochmal inkludiert.

    david

    I like Toast!

  • stormcrow
    6
    stormcrow
    Mitglied
    Punkte
    360
    Beiträge
    72
    • 21. Oktober 2005 um 20:08
    • #6

    hmm, also ich kenn file guards eigentlich nur mit

    Code
    #endif // HEADER_H


    am ende. mag grad ned nachdenkn obs bei der einen oder andren variante probleme gebn koennt, sondern wollts nur anmerkn.

    I came here to chew gum and kick ass, and I'm all out of gum...

  • jeuneS2
    11
    jeuneS2
    Mitglied
    Reaktionen
    17
    Punkte
    1.227
    Beiträge
    238
    • 21. Oktober 2005 um 21:57
    • #7
    Zitat von stormcrow

    hmm, also ich kenn file guards eigentlich nur mit

    Code
    #endif // HEADER_H


    am ende. mag grad ned nachdenkn obs bei der einen oder andren variante probleme gebn koennt, sondern wollts nur anmerkn.


    Diese Variante ist richtig, erstere ist a) syntaktisch nicht korrekt und b) sinnlos, weil beim nächsten Mal includen der Guard ja wieder nicht definiert ist.

    Why bother spending time reading up on things? Everybody's an authority, in a free land.

  • bnd
    4
    bnd
    Mitglied
    Punkte
    170
    Beiträge
    31
    • 22. Oktober 2005 um 15:11
    • #8
    Zitat von stormcrow

    hmm, also ich kenn file guards eigentlich nur mit

    Code
    #endif // HEADER_H


    am ende. mag grad ned nachdenkn obs bei der einen oder andren variante probleme gebn koennt, sondern wollts nur anmerkn.

    Musst nicht nachdenken, das ist korrekt.

    The mainframes are dead, long live the mainframes!
    http://jedi.informatik.uni-leipzig.de/index.html

  • Maximilian Rupp 27. Dezember 2024 um 12:06

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung

  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  • Deutsch
  • English
Zitat speichern