Erstellen einer eigenen Header-Datei in C.


Antworten:


298

foo.h

#ifndef FOO_H_   /* Include guard */
#define FOO_H_

int foo(int x);  /* An example function declaration */

#endif // FOO_H_

foo.c

#include "foo.h"  /* Include the header (not strictly necessary here) */

int foo(int x)    /* Function definition */
{
    return x + 5;
}

Haupt c

#include <stdio.h>
#include "foo.h"  /* Include the header here, to obtain the function declaration */

int main(void)
{
    int y = foo(3);  /* Use the function here */
    printf("%d\n", y);
    return 0;
}

Kompilieren mit GCC

gcc -o my_app main.c foo.c

2
@ Anu: Ich kann das in diesem Format nicht lesen. Sie können Ihre ursprüngliche Frage so bearbeiten, dass sie diesen Code enthält.
Oliver Charlesworth

3
Es ist erwähnenswert, dass dieser Code nicht funktioniert, wenn Sie versuchen, ihn nur per Schaltfläche zu erstellen (z. B. "Erstellen und Ausführen" in Code :: Blocks). Es mag für Sie offensichtlich erscheinen, aber für mich ist es das erste Mal, dass es passiert ist, und ich habe einige Zeit gebraucht, um herauszufinden, wo das Problem liegt.
Jeyekomon

5
@Jeyekomon: Nun, wo ist das Problem?
Oliver Charlesworth

2
Niemand hat mir gesagt, dass die Schaltfläche "Erstellen und Ausführen" nicht für alles ausreicht. :-) Es war eine ziemliche Überraschung für mich (ich bin ein Neuling). Jetzt muss ich wohl erst lernen, die Kommandozeile oder Makefiles zu benutzen.
Jeyekomon

1
Ich habe mich gefragt, ob Sie näher erläutern können, wie Sie mit allen erforderlichen Dateien kompilieren können und nicht foo.c in das gcc-Programmargument aufnehmen müssen. Wie heißt diese Technik oder welches Programm kann dies außerhalb von IDE erreichen - Make kommt mir in den Sinn
nf071590

26
#ifndef MY_HEADER_H
# define MY_HEADER_H

//put your function headers here

#endif

MY_HEADER_H dient als Doppeleinschlussschutz.

Für die Funktionsdeklaration müssen Sie nur die Signatur definieren, dh ohne Parameternamen wie folgt:

int foo(char*);

Wenn Sie wirklich möchten, können Sie auch den Bezeichner des Parameters einschließen, dies ist jedoch nicht erforderlich, da der Bezeichner nur im Hauptteil einer Funktion (Implementierung) verwendet wird, der im Falle eines Headers (Parametersignatur) fehlt.

Dies deklariert die Funktion, foodie a akzeptiert char*und an zurückgibt int.

In Ihrer Quelldatei hätten Sie:

#include "my_header.h"

int foo(char* name) {
   //do stuff
   return 0;
}

Sie sind als Funktion bekannt Erklärungen oder Funktionsprototypen , nicht „Funktionsköpfe“. Header sind die Dateien, die Sie einschließen, nicht die darin enthaltenen Deklarationen.
Jonathan Wakely

@ JonathanWakely Das sind die Header-Dateien. Der Name sagt schon alles: Header-Dateien enthalten Header. Aber danke für das Feedback, es hat mich für eine Sekunde nachdenken lassen.
Flavius

Nein, Header sind die Dateien selbst, nicht die darin enthaltenen Deklarationen. Können Sie eine einzige seriöse Referenz finden, um Ihre Verwendung von "Header" zu sichern? Dem widersprechen beispielsweise K & R, der C-Standard, die UNIX-Programmierumgebung und Wikipedia .
Jonathan Wakely

@ JonathanWakely hast du tatsächlich K & R gelesen? Das Inhaltsverzeichnis enthält einen Abschnitt "4.5 Header-Dateien" und "Header-Dateien" sind kursiv geschrieben und geben die Terminologie an. Im Rest des Buches schreiben die Autoren der Kürze halber manchmal nur "Header", aber durch Formatierung und Inhaltsverzeichnis ist klar, welche Terminologie richtig ist. Seien Sie also bitte ein Profi und erkennen Sie, wenn Sie falsch liegen.
Flavius

Ja, und "Header" bezieht sich auf die Dateien , nicht auf die darin enthaltenen Deklarationen. In der 2. Ausgabe finden Sie auf Seite 241 Erläuterungen zu Standard-Headern und auf Seite 33 Informationen zu Definitionen und Deklarationen (die Sie fälschlicherweise als "Funktions-Header" bezeichnen) und einen Header klar definieren : "Die übliche Praxis besteht darin, externDeklarationen von Variablen und zu sammeln Funktionen in einer separaten Datei, die in der Vergangenheit als Header bezeichnet wurde und #includeam Anfang jeder Quelldatei steht. Die Funktionen der Standardbibliothek werden beispielsweise in Headern wie <stdio.h>".
Jonathan Wakely

8

myfile.h

#ifndef _myfile_h
#define _myfile_h

void function();

#endif

myfile.c

#include "myfile.h"

void function() {

}

void function();als Deklaration verhindert nicht Anrufe wie function(42);. Verwenden Sie voidin der Erklärung wievoid function(void);
chux - Reinstate Monica

5

Header-Dateien enthalten Prototypen für Funktionen, die Sie in einer .c- oder .cpp / .cxx-Datei definieren (je nachdem, ob Sie c oder c ++ verwenden). Sie möchten # ifndef / # define um Ihren .h-Code platzieren, sodass die Prototypen nur einmal enthalten sind, wenn Sie dieselbe .h zweimal in verschiedenen Teilen Ihrer Programme einfügen.

client.h

#ifndef CLIENT_H
#define CLIENT_H

short socketConnect(char *host,unsigned short port,char *sendbuf,char *recievebuf, long rbufsize);


#endif /** CLIENT_H */

Dann würden Sie die .h in eine .c-Datei wie folgt implementieren:

client.c

#include "client.h"

short socketConnect(char *host,unsigned short port,char *sendbuf,char *recievebuf, long rbufsize) {
 short ret = -1;
 //some implementation here
 return ret;
}

"Wenn Sie dieselbe .h zweimal in verschiedenen Teilen Ihrer Programme einfügen, werden die Prototypen nur einmal eingefügt." Das ist irreführend. Sie schützen davor, dieselbe Header-Datei zweimal aus derselben Quelldatei einzuschließen (das zweimalige Einfügen eines Headers in zwei verschiedene Quelldateien ist in Ordnung und normalerweise erforderlich!), Und das erneute Deklarieren von Funktionsprototypen ist kein Problem, da Typen und globale Variablen neu definiert werden ist das, wovor man sich schützen muss.
Jonathan Wakely
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.