Info über Headerdatei?
-
Hi, ich habe mir gerade mal eine Headerdatei angeschaut.
Ich möchte mir mal selber eine schöne artgerechte Headerdatei machen...Also wie gesagt hab ich mich da umgeguckt, nur hab ich nirgenswo Funktionen stehen sehen..
Da wurden die Funktionen vordeklariert und davor stand überall _CRTIMP..Wo stehen die Funktionen denn?
2. Frage: könnte ich auch Funktionen in eine Headerdatei schreiben, oder soll eine Codedatei schreiben mit den Funktionen, und dazu eine Headerdatei, die man inkludieren kann und ind er anderen Codedatei die Funktionen aus der dazugehörigen Codedatei deklariert?
-
int foo( int bar ); // Deklaration
Definition:
int foo( int bar ) { return bar; }
Deklarationen kommen in den Header - sofern die Funktion/Variable öffentlich - bekannt ist (sein muss) und die Definitionen in die
.c
.head.. schrieb:
Wo stehen die Funktionen denn?
Entweder in einer
.c
, welche kompiliert wird. Das daraus entstandene Object (.obj
) wird zu deinem Programm gelinkt. Oder aber in einer Library, die entweder statisch oder dynamisch gelinkt werden kann.greetz, Swordfish
-
Zur ersten Frage: Das _CRTIMP Symbol importiert die Funktionsprototypen aus der C Runtime Library (in DLL's verpackt) in das Programm. _CRTIMP ist lediglich ein Verweis auf __declspec(dllimport), und veranlasst den Compiler, die Funktionen aus der DLL zu laden. Ist aber nicht weiter wichtig, habe ich noch nie gebraucht.
Zur zweiten Frage: Ja, das ist sogar üblich so, dass man in eine Headerdatei z.B. die Klassendeklaration incl. aller zugehörigen Member deklariert, und dann in einer extra .cpp Datei definiert.
(Argh mist, ich rede schonwieder von C++. Beschränken wir uns mal nur auf Funktionen, und nicht auf Klassen
)
-
Hey cool, sehr schnelle Hilfe, und dazu noch total nett
Zwei weitere Fragen habe ich aber noch
1. Also kann ich mir z.B. den Code von fprintf() nicht angucken?
((Als ich mal solch einen Access Violation Fehler hatte, wurde mir irgendein Code mit fprintf gezeigt ._. )2. Wie soll ich das denn mit meinen eigenen Headerdateien machen?
Ich fände es irgendwie cooler, wenn man nur #include <mainss.h> schreiben, und nicht noch eine .c Datei zum Projekt hinzufügen müsste.
-
1: Ne, leider nicht. fprintf() liegt aber nicht in der CRL, sondern in einer Library (ist eine kompilierte Codedatei, jedoch nicht ausführbar).
2: Naja, es geht nicht um "cooler". Du könntest dir entgegen aller Ratschläge die Funktionen gleich in der Header definieren, dann entfällt die zusätzliche .c Datei. Alles andere sind wiederrum fortgeschrittene Themen, und bringen dich nur durcheinander. (Es wäre noch ein Import einer eigenen Library möglich, beim VS sogar mit einem simplen pragma-Befehl...)
-
hm.. also so etwas wie pragma(lib, "ws2_32.lib") ?
wie würde das denn gehen?
also wie muss die lib datei aussehen, einfach nur die Funktionen hineinschreib?
-
hm.. also so etwas wie pragma(lib, "ws2_32.lib") ?
Ja genau, die Library sollte sich in dem Fall im /lib Verzeichnis der IDE befinden.
also wie muss die lib datei aussehen, einfach nur die Funktionen hineinschreib?
Ich habs mal vor Ewigkeiten ausprobiert, afaik geht das, indem man einfach seine Funktionen reinschreibt. Aber ob das so okay ist, kann ich dir nicht sagen, da ich damit keine weiteren Erfahrungen gemacht habe.
-
mikey schrieb:
2: Naja, es geht nicht um "cooler". Du könntest dir entgegen aller Ratschläge die Funktionen gleich in der Header definieren, dann entfällt die zusätzliche .c Datei. Alles andere sind wiederrum fortgeschrittene Themen, und bringen dich nur durcheinander. (Es wäre noch ein Import einer eigenen Library möglich, beim VS sogar mit einem simplen pragma-Befehl...)
Sowas ist aber bestenfalls eine Notfalllösung für Neulinge - und sollte gar nicht erst eingeführt werden. Sobald die Programme größer werden, teilt man sie sowieso auf mehrere .C-Dateien auf (schon um die Compile-Zeiten zu beschleunigen), da sind Definitionen direkt im Header tödlich. Die beste Lösung ist es wirklich, konsequent Deklaration und Definitionen zu trennen (und dem Compiler alle benötigten .C-Dateien mitzugeben).