Was bedeuten die Dateierweiterungen .c und .h für C?

Lesezeit: 5 Minuten

Benutzeravatar von Alex Mcp
Alex McP

Es ist alles im Titel; Super einfach, denke ich, aber es ist so schwer, irgendwo nach syntaktischen Dingen zu suchen.

Dies sind zwei Bibliotheksdateien, aus denen ich kopiere CS50.netund ich frage mich, warum sie zwei verschiedene Erweiterungen haben.

Benutzeravatar von Stefano Borini
Stefan Borini

.c : c-Datei (wo im Allgemeinen die eigentliche Aktion stattfindet)

.h : Header-Datei (muss in einen Präprozessor eingeschlossen werden #include Richtlinie). Enthält Dinge, die normalerweise mit anderen Teilen Ihres Codes geteilt werden, wie Funktionsprototypen, #define’d-Zeug, externe Deklaration für globale Variablen (oh, der Horror) und dergleichen.

Technisch gesehen könnten Sie alles in einer einzigen Datei ablegen. Ein ganzes C-Programm. Millionen Zeilen. Aber wir Menschen neigen dazu, Dinge zu organisieren. Sie erstellen also verschiedene C-Dateien, die jeweils bestimmte Funktionen enthalten. Das ist alles schön und sauber. Dann merkst du plötzlich, dass a Erklärung Sie in eine bestimmte C-Datei haben, sollte auch in einer anderen C-Datei vorhanden sein. Sie würden sie also duplizieren. Am besten ist es daher, die Deklaration zu extrahieren und in eine gemeinsame Datei, die .h, zu packen

Beispielsweise finden Sie in der cs50.h sogenannte “Forward Declarations” Ihrer Funktionen. Eine Vorwärtsdeklaration ist eine schnelle Möglichkeit, dem Compiler mitzuteilen, wie eine Funktion aufgerufen werden soll (z. B. welche Eingabeparameter) und was sie zurückgibt, damit er eine ordnungsgemäße Überprüfung durchführen kann (z. B. wenn Sie eine Funktion mit der falschen Anzahl von Parametern aufrufen, wird es werde reklamieren).

Ein anderes Beispiel. Angenommen, Sie schreiben eine .c-Datei, die eine Funktion enthält, die den Abgleich regulärer Ausdrücke durchführt. Sie möchten, dass Ihre Funktion den regulären Ausdruck, die zu vergleichende Zeichenfolge und einen Parameter akzeptiert, der angibt, ob beim Vergleich zwischen Groß- und Kleinschreibung unterschieden werden muss.

in der .c werden Sie daher setzen

bool matches(string regexp, string s, int flags) { the code }

Nehmen wir nun an, Sie möchten die folgenden Flags übergeben:

0: wenn bei der Suche zwischen Groß- und Kleinschreibung unterschieden wird

1: wenn bei der Suche zwischen Groß- und Kleinschreibung unterschieden wird

Und Sie möchten sich für neue Flags offen halten, also haben Sie keinen booleschen Wert gesetzt. Das Spielen mit Zahlen ist schwierig, also definieren Sie sinnvolle Namen für diese Flags

#define MATCH_CASE_SENSITIVE 0
#define MATCH_CASE_INSENSITIVE 1

Diese Informationen werden in die .h-Datei eingefügt, denn wenn ein Programm diese Labels verwenden möchte, kann es sie nur kennen, wenn Sie die Informationen einfügen. Natürlich können Sie sie in die .c einfügen, aber dann müssten Sie den .c-Code (ganz!) einfügen, was Zeitverschwendung und eine Quelle von Ärger ist.

  • Dies kann auch helfen: Dies kann auch helfen: stackoverflow.com/questions/3482948/…. Vieles gleich, aber etwas anders erklärt.

    – spugm1r3

    17. September 2016 um 20:08 Uhr

Benutzeravatar von Sinan Ünür
Sinan Ünür

Natürlich gibt es nichts, was besagt, dass die Endung eine Header-Datei sein muss .h und die Endung einer C-Quelldatei sein muss .c. Dies sind nützliche Konventionen.

E:\Temp> type my.interface
#ifndef MY_INTERFACE_INCLUDED
#define MYBUFFERSIZE 8
#define MY_INTERFACE_INCLUDED
#endif

E:\Temp> type my.source
#include <stdio.h>

#include "my.interface"

int main(void) {
    char x[MYBUFFERSIZE] = {0};
    x[0] = 'a';
    puts(x);
    return 0;
}

E:\Temp> gcc -x c my.source -o my.exe

E:\Temp> my
a

  • Danke dafür! Ich dachte an die Erweiterungen .h und .c waren obligatorisch und ich hätte nie anders gedacht!

    – KeyC0de

    16. Februar 2017 um 20:34 Uhr

Sie sind nicht wirklich Bibliotheksdateien. Sie sind nur Quelldateien. Wie Stefano sagte, die .c Datei ist die C-Quelldatei, die tatsächlich die tatsächliche Quelle dessen verwendet / definiert, was sie lediglich in der Datei skizziert hat .h Datei, die Header-Datei. Die Header-Datei umreißt normalerweise alle Funktionsprototypen und -strukturen, die in der eigentlichen Quelldatei verwendet werden. Stellen Sie es sich wie eine Referenz / einen Anhang vor. Dies wird deutlich, wenn Sie sich die Header-Datei ansehen, wie Sie sehen werden 🙂 Wenn Sie also etwas verwenden möchten, das in diesen Quelldateien geschrieben wurde, müssen Sie #include die Header-Datei, die die Informationen enthält, die der Compiler kennen muss.

  • Gute Aufklärung, danke. Also #include ich , aber das wiederum ruft die eigentlich benötigten Funktionen aus cs50.c auf. Dies ist, was ich aus dem Lesen der Dateien vermute, ist das richtig?

    – Alex Mcp

    8. November 2009 um 3:12 Uhr

  • Ja so geht das meistens. Allerdings ist #include normalerweise für Dateien reserviert, die mit dem Compiler geliefert wurden, wie z , vorzugsweise dort, wo sich Ihre anderen Quelldateien befinden.

    – Jorge Israel Peña

    8. November 2009 um 3:15 Uhr

  • Wenn ich mich recht erinnere, wird von der Verwendung von “” abgeraten. Sie sollten immer <> verwenden und das -I richtig einstellen.

    – Stefan Borini

    8. November 2009 um 3:33 Uhr

  • @Stefano Borini siehe 6.10.2: Eine Vorverarbeitungsanweisung des Formulars # include "q-char-sequence" new-line bewirkt, dass diese Direktive durch den gesamten Inhalt der Quelldatei ersetzt wird, die durch die angegebene Sequenz zwischen den identifiziert wird " Trennzeichen. Die genannte Quelldatei wird implementierungsdefiniert gesucht. Wenn diese Suche nicht unterstützt wird oder die Suche fehlschlägt, wird die Anweisung erneut verarbeitet, als ob sie gelesen worden wäre # include <h-char-sequence> new-line

    – Sinan Ünür

    8. November 2009 um 4:14 Uhr

.c ist die Quelldatei und .h ist die Header-Datei.

Die .c-Dateien sind Quelldateien, die kompiliert werden. Die .h-Dateien werden verwendet, um die API eines Programms entweder einem anderen Teil dieses Programms oder einem anderen Programm bereitzustellen, wenn Sie eine Bibliothek erstellen.

Beispielsweise könnte das Programm PizzaDelivery 1 .c-Datei mit dem Hauptprogramm und 1 .c-Datei mit Hilfsfunktionen haben. Damit der Hauptteil des Programms nun die Hilfsfunktionen verwenden kann, müssen Sie die API über den Funktionsprototyp in einer .h-Datei bereitstellen, wobei diese .h-Datei in die Haupt-.c-Datei eingeschlossen wird.

Benutzeravatar von Khaled Alshaya
Khaled Alshaya

.c : 'C' source code
.h : Header file

Normalerweise ist die .c Dateien enthalten die Implementierung und .h Dateien enthalten die “Schnittstelle” einer Implementierung.

1417650cookie-checkWas bedeuten die Dateierweiterungen .c und .h für C?

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

Privacy policy