Variablendeklaration in einer Header-Datei [duplicate]

Lesezeit: 4 Minuten

Benutzeravatar von Ori Popowski
Ori Popowski

Falls ich eine Variable habe, die in mehreren Quellen verwendet werden kann – ist es eine gute Praxis, sie in einem Header zu deklarieren? oder ist es besser, es in a zu erklären .c Datei und Verwendung extern in anderen Dateien?

Du solltest erklären die Variable in einer Header-Datei:

extern int x;

und dann definieren es hinein eines C-Datei:

int x;

In C besteht der Unterschied zwischen einer Definition und einer Deklaration darin, dass die Definition Platz für die Variable reserviert, während die Deklaration lediglich die Variable in die Symboltabelle einführt (und den Linker veranlasst, danach zu suchen, wenn es um die Linkzeit geht). .

  • Beide sind Erklärungen! Im Dateibereich ist die zweite keine (vollständige) Definition, sondern eine vorläufige Definition.

    – zu ehrlich für diese Seite

    5. Oktober 2016 um 12:49 Uhr


  • @toohonestforthissite Was soll der Unterschied zwischen den beiden Arten von Definitionen sein? Und was meinst du mit Dateibereich?

    – Balázs Börcsök

    3. Mai um 12:23 Uhr


Benutzeravatar von Henk Holterman
Henk Holtermann

Sie sollten es als deklarieren extern in einer Header-Datei, und definieren Sie es in genau 1 .c-Datei.

Beachten Sie, dass die .c-Datei auch den Header verwenden sollte und das Standardmuster so aussieht:

// file.h
extern int x;  // declaration

// file.c
#include "file.h"
int x = 1;    // definition and re-declaration

Neudefinition ist ein Fehler, aber Neudeklaration ist in Ordnung und oft notwendig.

  • In der Tat sollte Verwenden Sie immer den Header, damit der Compiler Ihnen mitteilt, wenn die Typen zwischen Deklaration und Definition aus dem Gleichgewicht geraten.

    – Café

    22. Juli 2009 um 14:21 Uhr

  • Katze, du hast Recht, ich formuliere es ein wenig um.

    – Henk Holtermann

    22. Juli 2009 um 14:26 Uhr

Wenn Sie es so erklären

int x;

In einer Header-Datei, die dann an mehreren Stellen eingefügt wird, erhalten Sie am Ende mehrere Instanzen von x (und möglicherweise Probleme beim Kompilieren oder Verknüpfen).

Der richtige Weg, dies anzugehen, besteht darin, die Header-Datei sagen zu lassen

extern int x; /* declared in foo.c */

und dann in foo.c können Sie sagen

int x; /* exported in foo.h */

Dann können Sie Ihre Header-Datei an so vielen Stellen einfügen, wie Sie möchten.

Der Schlüssel liegt darin, die Deklarationen der Variablen in der Header-Datei und der Quelldatei gleich zu halten.

Ich benutze diesen Trick

------sample.c------
#define sample_c
#include sample.h

(rest of sample .c)

------sample.h------
#ifdef sample_c
#define EXTERN
#else
#define EXTERN extern
#endif

EXTERN int x;

Sample.c wird nur einmal kompiliert und definiert die Variablen. Jede Datei, die sample.h enthält, erhält nur das „extern“ der Variablen; es weist Platz für diese Variable zu.

Wenn Sie den Typ von x ändern, ändert er sich für alle. Sie müssen nicht daran denken, es in der Quelldatei und der Header-Datei zu ändern.

Was ist mit dieser Lösung?

#ifndef VERSION_H
#define VERSION_H

static const char SVER[] = "14.2.1";
static const char AVER[] = "1.1.0.0";

#else

extern static const char SVER[];
extern static const char AVER[];

#endif /*VERSION_H */

Der einzige Nachteil, den ich sehe, ist, dass der Include-Wächter Sie nicht rettet, wenn Sie ihn zweimal in dieselbe Datei einfügen.

  • 1) Der #ifndef-Wächter verhindert Mehrfachdefinitionen in a Single Quelldatei (also machen die externen Definitionen nichts). 2) Das Deklarieren einer statischen Variablen in einem Header bedeutet, dass jede Quelldatei, die sie enthält, eine eigene Version dieser Variablen hat und nicht eine einzelne gemeinsam genutzte Variable. Technisch gesehen wird dies verknüpft, aber das Verhalten ist möglicherweise nicht erwünscht (möglicherweise bemerken Sie nicht, dass Sie in diesem Beispiel konstante Variablen verwendet haben, aber verwenden Sie es für etwas Nicht-Konstantes, und Sie werden sehen, dass es wichtig ist). Die akzeptierte Antwort ist fast immer die richtige Lösung.

    – Assimilator

    31. Mai 2016 um 16:25 Uhr

  • 1) Der #ifndef-Wächter verhindert Mehrfachdefinitionen in a Single Quelldatei (also machen die externen Definitionen nichts). 2) Das Deklarieren einer statischen Variablen in einem Header bedeutet, dass jede Quelldatei, die sie enthält, eine eigene Version dieser Variablen hat und nicht eine einzelne gemeinsam genutzte Variable. Technisch gesehen wird dies verknüpft, aber das Verhalten ist möglicherweise nicht erwünscht (möglicherweise bemerken Sie nicht, dass Sie in diesem Beispiel konstante Variablen verwendet haben, aber verwenden Sie es für etwas Nicht-Konstantes, und Sie werden sehen, dass es wichtig ist). Die akzeptierte Antwort ist fast immer die richtige Lösung.

    – Assimilator

    31. Mai 2016 um 16:25 Uhr

1417820cookie-checkVariablendeklaration in einer Header-Datei [duplicate]

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

Privacy policy