-
        

Ergebnis 1 bis 10 von 10

Thema: Wie wird ne Header Datei richtig aufgebaut

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    04.01.2005
    Ort
    Rendsburg
    Alter
    32
    Beiträge
    306

    Wie wird ne Header Datei richtig aufgebaut

    Anzeige

    Moin

    Meine Main datei ist mittlerweile ein wenig groß geworden und dadurch unübersichtlich und da wollte ich mal fragen wie man eine Heder datei richtig aufbaut!

    Wäre nett wenn jemand mal ein Beispiel hier postn könnte!

    Wäre auch gewollt das ins Wiki zu übertragen!


    Gruß Cybrix
    Wenn etwas klemmt, wende Gewalt an.

    Wenn es kaputt geht,
    hätte es sowieso erneuert werden müssen.

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Schau mal in RN-Wissen bei den C-Beispielen, zB zum UART oder FIFO. Da sind jeweils auch Header dabei, wo du den Aufbau siehst. ALlerdings ist da nicht erklärt, warum der Aufbau jeweils so ist.

    Typischerweise ist jeder Header durch #ifdef oder #if defined() gegen Mehrfachincludes geschützt. Für die im Header enthaltenen Deklarationen ist das nicht notwendig, wohl aber für die Definitionen (Defines, statische Inline-Funktionen, typedef, etc.)
    Disclaimer: none. Sue me.

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    04.01.2005
    Ort
    Rendsburg
    Alter
    32
    Beiträge
    306
    Also wenn ich das jetzt richtig gesehen habe kann ich meine Funktionen ein fach so hintereinander einfügen !

    Ich bräuchte dann nur #ifdef noch an anfang schreiben aber ich verstehe z.B. nicht warum da #ifdef _UART_H_ steht und nicht uart.h ?
    Wenn etwas klemmt, wende Gewalt an.

    Wenn es kaputt geht,
    hätte es sowieso erneuert werden müssen.

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Makronamen in C müssen so aufgebaut sein wie Bezeichner in C, dürfen also zB keinen . enthalten. Konvention ist, Makro-Namen groß zu schreiben, damit man sofort sieht, daß es sich dabei um ein Makro handelt.

    C-Funktionen gehören nicht in einen Header, sondern in eine C-Datei. Jede C-Datei wird für sich übersetzt zu einem Objekt (*.o). In dem Objekt sind idR noch externe Referenzen enthalten. Wenn du zB in a.c hast void foo() und willst foo in b.c verwenden, dann schreibst du in b.c #include "a.h" und in a.h steht extern void foo(); was foo bekannt macht.

    Beim Compilieren von b.c weiß der Compiler dann, wie er foo zu benutzen hat, ohne daß er wissen muss, was diese Funktion tut.

    Zusammengebastelt wird das alles erst beim Linken/Lokatieren. Dort werden die benötigten Module zusammengebunden und festgelegt, wo im Speicher was landet. Ein bisschen dazu steht im Artikel avr-gcc/Interna
    Disclaimer: none. Sue me.

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    04.05.2005
    Ort
    Steiermark/AT
    Alter
    35
    Beiträge
    36
    hi,

    weil im .h file ja "_UART_H_" definiert wird und nicht "uart.h".

    hier mal ein beispiel:

    wenn nicht defined _UART_H_
    --> #ifndef _UART_H_

    dann definen wir _UART_H_ einfach
    --> #define _UART_H_

    beim nächsten aufruf wäre _UART_H_ schon defined und die #ifndef abfrage würde false liefern dadurch wird der code nicht ausgeführt sondern übersprungen +rollingeys+

    hoffe das ist so verständlich

    lg

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    04.01.2005
    Ort
    Rendsburg
    Alter
    32
    Beiträge
    306
    gut also sollte ich meine c funktionen in eine c datei schreiben oder wie jetzt?

    Und was kommt denn in eine header datei rein?
    Wenn etwas klemmt, wende Gewalt an.

    Wenn es kaputt geht,
    hätte es sowieso erneuert werden müssen.

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    04.05.2005
    Ort
    Steiermark/AT
    Alter
    35
    Beiträge
    36
    ja funktionen in die .c-datei und die funktions-definitionen in die .h datei und die .h datei dann in dein main.c includieren

    achtung dann beim linken, dass auch alle c files mitgelinkt werden ..

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    04.01.2005
    Ort
    Rendsburg
    Alter
    32
    Beiträge
    306
    Aber brauche ich in ner c datei nicht nicht ne main funktion?
    Wenn etwas klemmt, wende Gewalt an.

    Wenn es kaputt geht,
    hätte es sowieso erneuert werden müssen.

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    04.05.2005
    Ort
    Steiermark/AT
    Alter
    35
    Beiträge
    36
    du brauchst für ein c-programm eine main-funktion welche meistens in einem main.c file definiert ist.

    dieses main.c includiert irgendwelche header-dateien, die funktionsdefinitionen von "externen" funktionen beinhaltet und diese beschreibt.
    die wirklichen funktionen können nun in anderen c-files stehen und benötigen dann natürlich keine eigene main-funktion.

    ** EDIT **
    hier mal ein paar links zur c-programmierung allgemein:
    http://www.galileocomputing.de/openbook/c_von_a_bis_z/
    http://de.wikibooks.org/wiki/C-Programmierung

    lg

  10. #10
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Nein, du brauchst in einer C-Datei keine main-Funktion. Du kannst ein C-Modul auch ohne main() compilieren bis zum Objekt (*.o). Nur so ist es überhaupt möglich, Bibliotheken (*.a, *.so, *.dll) mit C-Funktionen zu erstellen. Diese Biblioheken enthalten nähmlich keinen C-Quellcode, sondern den Code in compilierter Form.

    Eine main brauchst du erst dann, wenn du diese Module zu einem lauffähigen Programm zusammenfügst (linkst). Der Startup-Code, der die Umgebung für den Programmlauf schafft (globale Variablen initialisieren, Stack initialisieren, etc) hat an seinem Ende einen Sprung zu main(). Findet der Linker in den angegebenen Modulen keine main(), wird er das als unaufgelöste Referenz anmeckern.

    Bei GCC kannst du auch mehrere C-Dateien compileren, assemblieren und linken mit
    GCC a.c b.c ...
    Dies beinhaltet dann neben dem eigentlichen Compilieren (Bei GCC wird darunter im engeren Sinne nur die Abbildung von C/C++/Java/ObjC/Fortran nach Assembler verstanden) auch das Assemblieren (ins Object-Format transformieren, was der Assembler erledigt) und das Linken/Lokatieren (Aufgabe des Linkers). Ohne weitere Angaben ruft GCC diese Programme stillschweigend auf.

    Die Aufrufe kannst du mit GCC -v ... anzeigen lassen.
    Disclaimer: none. Sue me.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •