from Externe Funktionen in C vs C++




use c++ class in c (4)

In *.h Header-Dateien einer C Bibliothek sollte man Funktionen deklarieren

extern void f();

// or only 

void f();
  1. bei Verwendung nur in C
  2. bei Verwendung von C++ .

Für den allgemeinen Gebrauch deklarieren Sie als

#ifdef __cplusplus
extern "C" {
#endif
  void f(void);
#ifdef __cplusplus
}
#endif

Ansonsten ist extern obsolet.


Letzteres ist völlig in Ordnung, da es sich nur um eine Funktionsdefinition handelt, die denjenigen, die diesen Header enthalten, mitteilt: "Irgendwo hier in der Nähe gibt es eine Funktion mit diesem Prototyp."

In diesem Zusammenhang unterscheiden sich Funktionen deutlich von Variablen, aber das ist eine andere Sache. Stellen Sie jedoch sicher, dass Sie den Funktionsrumpf nicht einschließen, es sei denn, Sie deklarieren ihn als 'inline' oder als Teil einer Klassendefinition (C ++) oder als 'Template-Funktion' (auch C ++).


Das Schlüsselwort extern [fast] nie verwendet werden, wenn eine Funktion in C oder C ++ deklariert wird. In C und in C ++ sind alle Funktionen standardmäßig extern verknüpft. Die seltsame Angewohnheit, Funktionen in Header-Dateien mit extern deklarieren, hat wahrscheinlich einige historische Wurzeln, ist aber schon seit Jahrzehnten völlig irrelevant.

Es gibt eine [obskure?] Ausnahme von der obigen in C, die wahrscheinlich nicht direkt mit dem zusammenhängt, wonach Sie fragen: in C (C99), wenn in einer Übersetzungseinheit eine Funktion als inline definiert und auch als extern (an deklariert ist wird explizit extern verwendet), dann dient die Inline-Definition dieser Funktion auch als externe Definition . Wenn in der Übersetzungseinheit keine Deklarationen mit explizitem extern vorhanden sind, wird die Inline-Definition nur als "interne" Definition verwendet.

PS Es gibt so etwas wie extern "C" in C ++, aber das ist eine ganz andere Sache.


Die Angabe von extern in function prototype hat keine Auswirkung, da dies standardmäßig angenommen wird. Wenn ein Compiler einen Prototyp sieht, geht er davon aus, dass eine Funktion an einer anderen Stelle definiert ist (in der aktuellen oder einer anderen Übersetzungseinheit). Dies gilt für beide Sprachen.

Der folgende Thread enthält im Allgemeinen einige nützliche Kommentare zu extern.

Auswirkungen des Schlüsselworts extern auf C-Funktionen







c