C Header schreiben

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • C Header schreiben

    Hallo C freunde!

    Ich möchte ein kleines C programm schreiben da ich in diesem Programm funktionen benutze die ich auch in anderen Programmen nutzen möchte und da ich das ganze etwas übersichtlicher gestalten möchte würde ich diese Funktionen gerne in ein Header File auslagern. Leichter gesagt als getan. Ich habe nun etwas im Internet gelesen und die ganze Geschichte verwirrt mich etwas war nämlich der meinung ich kann einfach alles in eine .h Datei packen und das wars!

    Wenn ich das jetzt richtig verstanden habe muss ich folgendes tun:

    ich schreibe erst eine .h datei

    Quellcode

    1. #ifndef header.h
    2. #define header.h
    3. int bla();
    4. int blub();
    5. #endif


    dann schreibe ich eine c datei in der ich die funktionen aus dem header initialisiere

    Quellcode

    1. #include "header.h"
    2. int blub()
    3. {
    4. // mach irgendwas
    5. }
    6. int bla()
    7. {
    8. // mach irgendwas
    9. }
    Alles anzeigen


    dann compile ich das ganze und dann schreibe ich mein eigentliches programm
    in dem ich dann den header sowohl als auch die c datei einbinde?????
    ist das so richtig ???

    kann ich das ganze nicht einfach in den Header packen bzw wieso sollte man das so aufteilen ?

    Danke für eure Hilfe

    Mit freundlichen Grüßen
  • Für das was du vorhast bieten sich in C mehrere Lösungen an:
    1. was du angedacht hast
    2. du bastelst dir eine Bibliothek deren Funktionen du auch mit einem Header verfügbar machst.
    3. du schreibst eine dll.

    Die erste Variante ist meist die einfachste.
    Beispiel:

    Quellcode

    1. // demo header addition
    2. // 2011jun11
    3. #ifndef demoadd.h
    4. #define demoadd.h
    5. int addi(int sum1, int sum2);
    6. #endif


    die C datei dazu:

    Quellcode

    1. // demo funktion addition
    2. // 2011jun11
    3. #include "demoadd.h"
    4. int addi( su1, su2)
    5. {
    6. return( su1 + su2 );
    7. }


    Und damit ihr das testen könnt:

    Quellcode

    1. // demo: split file
    2. // 2011jun11
    3. #include <stdio.h>
    4. #include "demoadd.h"
    5. int main()
    6. {
    7. int s1, s2;
    8. printf("Demo: Matheoperation in andere Datei ausgelagert\n");
    9. printf("1.Summand: ");
    10. scanf(" %d", &s1);
    11. printf("2.Summand: ");
    12. scanf(" %d", &s2);
    13. printf("Ergebnis: %d", addi(s1, s2));
    14. }
    Alles anzeigen


    Zum Compilieren + Linken bieten euch die grösseren IDE Projektverwaltungen.
    Also Projekt im Menu suchen - Daten eintragen, die gefordert werden und in diesem Fall die zwei Dateien mit der Endung .c anmelden.
    Dann auf Build oder so drücken und das Ganze sollte laufen.

    Wer es zu Fuss auf Kommandozeile machen möchte - auch das geht.
    Weitere Möglichkeiten Batch-/Script-Datei oder ein wenig anders make-Datei.

    Das eine Kurzfassung - für Vollständigkeit wird nix garantiert :D

    Das Beispiel ist für die Console - wer mehr Komfort benötigt --> ergänzen 8)

    MfG bcc-fan

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von bcc-fan ()

  • Beachte dass für die Makronamenvergabe die selben Regeln gelten wie bei einer normalen Variablenname.
    In deinem Fall "header.h" ist der Punkt unzulässig, welcher durch ein Unterstrich ersetzt werden kann und übersichtshalber
    werden Makronamen, genauso wie konstanten, Groß geschrieben: "HEADER_H".

    Bezüglich diesen Teiles:

    Quellcode

    1. #ifndef HEADER_H
    2. #define HEADER_H
    3. ...
    4. #endif

    Er dient ganz einfach der Überwachung der inkluiderten Datei, dh. eine rekursiven Einbindung wird dadruch unterbunden, und sollte am besten eindeutig gewählt werden; alá "__ENGINE_HEADER_H__".

    @topic
    Wie bcc-fan schon geschrieben hat hast du drei Möglichkeiten, wobei die letzen beiden vom Prinzip her, was die einbindung in ein Projekt angeht, identisch sind.

    1. "Normales" Linken
    Du erstellst eine Header und eine Sourcedatei die du in dein Projekt kopierst und zum Compilieren hinzufügst.
    Der Compiler übersetzt dabei die Sourcedatei in eine Objektdatei, in welcher der Linker, die in der Headerdatei befindlichen Funktionsprototypen, als Maschinencode wieder findet und zussamenfügen kann.

    2. Statische Bibliothek Linken
    Dabei wird der Sourcecode direkt von einem Compiler in eine Libdatei generiert, in welcher der Maschienencode enthalten ist.
    Im eigentlich Projekt muss neben der einbindung der Headerdatei auch die verlinkung im Linker mit der Libdatei getätigt werden.

    3. Dynamische Bibliothek Linken
    Aus dem Sourcecode wird eine Lib und eine Dll Datei generiert.
    Die verwendungen im Unterprojekt wird genauso wie bei Nr. 2 getätigt, wobei jedoch der Code nicht direkt in die Exe compiliert wird sondern die Funktionen auf die externe Bibliothek verweißen.

    Mfg Rushh0ur
  • Rushhour hat das schon richtig mit der Überwachung beschrieben. Seine Variante sollten alle C-Compiler verstehen.

    Die Variante, die ich einfach vom TO übernommen hab und oberflächlich getestet hatte, funktioniert auf dem Test-Compiler. Das bedeutet aber nicht das die überall funktionieren.

    Bei Microsoft und einigen anderen Compilern funktioniert auch statt:

    Quellcode

    1. #ifndef HEADER_H
    2. #define HEADER_H
    3. ...
    4. #endif


    folgendes ( Position Anfang Quelltext - siehe MSDN):

    Quellcode

    1. #pragma once


    oder man kann zum Beispiel den Compiler/Linker so ansteuern das der die Dateien prüft ob die schon im Projekt vorhanden sind und die nur einbindet, wenn die neu sind. Da solltet ihr euch Infos besorgen ob und wie das möglich ist bei eurem Compiler.

    Nochmal die anderen Varianten können funktionieren. Aber das müsst ihr für euren Compiler jeweils testen.
    Rushhours Variante sollte von allen C-Compilern verstanden werden.

    MfG bcc-fan