Erstellen Sie Ihre eigene Header-Datei in C

Lesezeit: 4 Minuten

Benutzeravatar von Anuragdeb3
Anuragdeb3

Kann jemand erklären, wie man eine Header-Datei in C mit einem einfachen Beispiel von Anfang bis Ende erstellt.

Benutzeravatar von Oliver Charlesworth
Oliver Charlesworth

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;
}

Mit GCC kompilieren

gcc -o my_app main.c foo.c

  • @Anu: Das kann ich in diesem Format nicht lesen. Sie können Ihre ursprüngliche Frage so bearbeiten, dass sie diesen Code enthält.

    – Oliver Charlesworth

    18. August 2011 um 16:54 Uhr

  • Es ist erwähnenswert, dass dieser Code nicht funktioniert, wenn Sie versuchen, ihn einfach per Schaltfläche zu erstellen (“build and run” in Code::Blocks zum Beispiel). 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

    7. Juni 2014 um 18:15 Uhr

  • @Jeyekomon: Nun, wo ist das Problem?

    – Oliver Charlesworth

    7. Juni 2014 um 18:16 Uhr

  • Niemand hat mir gesagt, dass die Schaltfläche “Build and Run” nicht für alles ausreicht. 🙂 Es war eine ziemliche Überraschung für mich (ich bin ein Neuling). Jetzt muss ich wohl lernen, zuerst die Kommandozeile oder Makefiles zu verwenden.

    – Jeyekomon

    7. Juni 2014 um 18:26 Uhr

  • Ich habe mich gefragt, ob Sie näher erläutern könnten, wie Sie mit allen erforderlichen Dateien kompilieren 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 – Make tun, kommt mir in den Sinn

    – nf071590

    9. Oktober 2014 um 22:31 Uhr

Benutzeravatar von Flavius
Flavius

#ifndef MY_HEADER_H
# define MY_HEADER_H

//put your function headers here

#endif

MY_HEADER_H dient als Doppeleinschlussschutz.

Für die Funktionsdeklaration brauchen Sie nur die Signatur, also ohne Parameternamen, wie folgt zu definieren:

int foo(char*);

Wenn Sie wirklich wollen, können Sie auch den Bezeichner des Parameters einschließen, aber das ist nicht notwendig, da der Bezeichner nur im Körper einer Funktion (Implementierung) verwendet würde, was im Falle eines Headers (Parametersignatur) fehlt.

Dies erklärt die Funktion foo die akzeptiert a char* und gibt ein zurück 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 Funktion Prototypen, nicht “Funktionsheader”. Header sind die Dateien, die Sie einschließen, nicht die darin enthaltenen Deklarationen.

    – Jonathan Wakely

    5. April 2019 um 10:36 Uhr


  • @JonathanWakely Das sind die Header-Dateien. Der Name sagt alles: Header-Dateien enthalten Header. Aber danke für das Feedback, es hat mich kurz nachdenklich gemacht.

    – Flavius

    8. April 2019 um 8:05 Uhr

  • Nein, Header sind die Dateien selbst, nicht die Deklarationen, die sie enthalten. Können Sie eine einzige seriöse Referenz finden, um Ihre Verwendung von “header” zu untermauern? Dem widerspricht K&R, der C-Standard, Die UNIX-Programmierumgebungund Wikipediazum Beispiel.

    – Jonathan Wakely

    8. April 2019 um 8:33 Uhr


  • Ja, und “Header” bezieht sich auf die Dateien, nicht die darin enthaltenen Erklärungen. In der 2. Ausgabe siehe Seite 241 für die Diskussion von Standard-Headern und Seite 33, die darüber spricht Definitionen und Erklärungen (die Sie fälschlicherweise “Funktionsheader” nennen) und eindeutig a definiert Header: „Die übliche Praxis ist das Sammeln extern Deklarationen von Variablen und Funktionen in einer separaten Datei, historisch a Headerdas ist enthalten durch #include am Anfang jeder Quelldatei. Die Funktionen der Standardbibliothek sind beispielsweise in Headern wie deklariert <stdio.h>.”

    – Jonathan Wakely

    10. April 2019 um 19:31 Uhr


  • Seite 26 definiert Funktionsprototyp, das auch im Rest des Buchs verwendet wird, und nirgendwo ist es mit “header” austauschbar. Siehe auch §A7.3.2 und §A8.6.3 für formelles Referenzmaterial zu Funktionsdeklarationen, das sie auch niemals “Header” nennt. Denn so heißen sie nicht.

    – Jonathan Wakely

    10. April 2019 um 19:41 Uhr

meinedatei.h

#ifndef _myfile_h
#define _myfile_h

void function();

#endif

meinedatei.c

#include "myfile.h"

void function() {

}

  • void function(); Als ein Erklärung verhindert nicht Anrufe wie function(42);. Verwenden void in dem Erklärung wie void function(void);

    – chux – Wiedereinsetzung von Monica

    14. Mai 2020 um 18:41 Uhr

  • @chux-ReinstateMonica warum WARUM sollte das erlaubt sein? Welche Art von Anwendungsfall würde es rechtfertigen, eine solche Definition und Anrufsignatur zuzulassen? (echt neugierig)

    – Killer der Zufälligkeit

    gestern

Benutzeravatar von djsumdog
djsumdog

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/#defines um Ihren .h-Code platzieren, sodass die Prototypen nur einmal enthalten sind, wenn Sie dasselbe .h zweimal in verschiedene Teile Ihres Programms 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 einer .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;
}

1425940cookie-checkErstellen Sie Ihre eigene Header-Datei in C

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy