Sollten Funktionen in Header-Dateien “extern” gemacht werden?

Lesezeit: 3 Minuten

Benutzeravatar von bodacydo
bodacydo

Sollen Funktionen gemacht werden extern in Header-Dateien? Oder sind Sie extern standardmäßig?

Soll ich zum Beispiel das hier schreiben:

// birthdays.h
struct person find_birthday(const char* name);

oder dieses:

// birthdays.h
extern struct person find_birthday(const char* name);

  • Eine Antwort, die viel verständlicher ist als die folgenden, finden Sie unter stackoverflow.com/a/18173554/4756270, Abschnitt “extern angewendet auf Funktionen”.

    – Luca Ceresoli

    13. November 2019 um 14:53 Uhr


Aus Das C-Buch:

Wenn eine Deklaration den externen Speicherklassenbezeichner enthält oder die Deklaration einer Funktion ohne Speicherklassenbezeichner ist (oder beides), dann:

  • Wenn es bereits eine sichtbare Deklaration dieses Bezeichners mit Dateibereich gibt, ist die resultierende Verknüpfung dieselbe wie die der sichtbaren Deklaration;
  • andernfalls ist das Ergebnis eine externe Verknüpfung.

Wenn dies also das einzige Mal ist, dass es in der Übersetzungseinheit deklariert wird, hat es eine externe Verknüpfung.

  • etwas verwirrend

    – Geremia

    14. Februar 2016 um 2:41 Uhr

  • Wenn Sie also zuerst eine Funktion als deklarieren static in einer Header-Datei und platzieren Sie dann eine andere extern Deklaration in derselben Datei unten, wird die letztere Deklaration ignoriert. Andernfalls wird es implizit durch Weglassen der Angabe gemacht extern. Aber es ist sehr wichtig zu verwenden extern zum Variablen in Header-Dateien, daher ziehen es die Leute manchmal vor, explizit zu sein und immer zu verwenden extern (auch wenn das Weglassen von Funktionen die gleiche Verknüpfung implizieren würde).

    – Lou

    20. Juli 2017 um 7:42 Uhr


Benutzeravatar von tur1ng
drehen

Sie werden implizit mit “extern” deklariert.

  • gilt das auch für Variablen?

    – Aravind

    19. Mai 2021 um 5:16 Uhr

  • @Aravind — nein, Variablen werden nicht implizit deklariert extern; Sie müssen die explizit hinzufügen extern vor Variablendeklarationen. Wie ich in meiner Antwort feststelle, bevorzuge ich die extern auch vor Funktionsdeklarationen, aus Symmetriegründen mit den wenigen globalen Variablendeklarationen, die der Compiler aber nicht braucht extern vor Funktionsdeklarationen und viele Leute ziehen es vor, es bei Funktionsdeklarationen wegzulassen. Funktionsdefinitionen erkennt man an der zusammengesetzten Anweisung oder dem Funktionsrumpf (eingeschlossen in { … }) anstelle eines Semikolons nach der Funktionssignatur.

    – Jonathan Leffler

    20. Juli 2021 um 16:24 Uhr


In Headern deklarierte Funktionen sind normalerweise (es sei denn, Sie arbeiten wirklich hart) extern. Ich persönlich ziehe es vor, das explizite Schlüsselwort dort zu sehen – aber der Compiler braucht es nicht. Es erinnert die Leser daran, dass sie es sind externund da Menschen fehlbarer sind als Computer, finde ich, dass die Erinnerung hilft.

Bei Variablen ist es wichtig, die zu verwenden extern Schlüsselwort (und kein Initialisierer) in der Header-Datei. Aus Symmetriegründen mit den (sehr wenigen) globalen Variablen, die in Headern deklariert sind, verwende ich daher extern mit der Funktion auch – obwohl es streng genommen nicht notwendig ist.

  • Ich füge das Explizite hinzu extern ein Brunnen; Deklarationen in Header-Dateien sind entweder extern oder static inline für Funktionen u extern oder static const für Variablen; etwas anderes wird selten benötigt

    – Christoph

    30. Juli 2010 um 7:50 Uhr

Benutzeravatar von StuartLC
StuartLC

Nein, in Header-Dateien deklarierte Funktionen müssen nicht deklariert werden extern.

Aber in a definierte Variablen .h Kopfzeile und dann #included in mehreren .c Dateien müssen als extern deklariert werden.

Ich kümmere mich nie um das “extern” in meinem Quellcode, aber manche Leute tun es. Wenn ich extern vor Variablen habe, aber keine Funktionen, ist es meiner Meinung nach visuell offensichtlicher, welche Dinge Funktionen und welche Dinge Variablen sind (möglicherweise einschließlich Funktionszeigern). Ich denke, vieles hängt wahrscheinlich davon ab, wie die Deklarationen in der .h-Datei erstellt werden und wie sie sich auf die Haupt-.c-Datei beziehen. Normalerweise beginne ich mit der Eingabe der .h-Datei-Prototypen und kopiere/füge sie dann in die .c-Datei ein und füge den Funktionskörper hinzu (durch Streichen des Semikolons am Ende des Prototyps), sodass “extern” hinzugefügt werden müsste die Header-Datei oder nach dem Kopieren/Einfügen aus der Haupt-.c-Datei gestrichen.

  • “extern” ist notwendig, wenn Sie globale Variablen direkt von mehreren Quelldateien (Modulen) gemeinsam nutzen müssen. Sie können dies mit Zugriffsfunktionen vermeiden, aber diese sind natürlich mit Kosten verbunden.

    – Kostas

    26. September 2017 um 9:27 Uhr

  • “extern” ist notwendig, wenn Sie globale Variablen direkt von mehreren Quelldateien (Modulen) gemeinsam nutzen müssen. Sie können dies mit Zugriffsfunktionen vermeiden, aber diese sind natürlich mit Kosten verbunden.

    – Kostas

    26. September 2017 um 9:27 Uhr

1408880cookie-checkSollten Funktionen in Header-Dateien “extern” gemacht werden?

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

Privacy policy