from - use c++ class in c




Externe Funktionen in C vs 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++ .

In Header-Dateien einer C-Bibliothek sollte man Funktionen deklarieren:

extern void f();
// or only
void f();

Ausgabe 1: Semantik

In einem C ++ - Programm werden die Funktionen als Funktionen deklariert, die keinen Wert zurückgeben und keine Argumente annehmen.

In einem C-Programm werden die Funktionen als Funktionen deklariert, die keinen Wert zurückgeben und eine unbestimmte Liste von Argumenten mit variabler Länge verwenden.

Verwenden Sie einen der folgenden Befehle, um die Bedeutung von 'no arguments' in C zu ermitteln:

extern void f(void);
void f(void);

Dieselbe Notation bedeutet auch dasselbe in C ++, obwohl für reinen C ++ - Code die Verwendung von void in der Argumentliste nicht idiomatisch ist (tun Sie dies nicht in reinem C ++ - Code).

Problem 2: Zusammenarbeit zwischen C und C ++

Tricky, aber die normale Regel wäre, dass Sie die Funktionen in C ++ als extern "C" deklarieren sollten. Um denselben Quellcode für beide zu verwenden, müssen Sie das Makro __cplusplus testen. Normalerweise machst du so etwas wie:

#ifdef __cplusplus
#define EXTERN_C       extern "C"
#define EXTERN_C_BEGIN extern "C" {
#define EXTERN_C_END   }
#else
#define EXTERN_C       /* Nothing */
#define EXTERN_C_BEGIN /* Nothing */
#define EXTERN_C_END   /* Nothing */
#endif

EXTERN_C void f(void);

EXTERN_C_BEGIN
    void f(void);
    int  g(int);
EXTERN_C_END

Die Optionen und Variationen sind vielfältig, aber der Header kann sowohl von C als auch von C ++ verwendet werden.

Die Makros werden normalerweise in einem universellen Header definiert, der überall verwendet wird, und der bestimmte Header stellt dann sicher, dass der universelle Header enthalten ist, und verwendet dann die entsprechende Form des Makros.

Ausgabe 3: Stil

Formal ist die extern Notation vor einer Funktionsdeklaration nicht erforderlich. Ich verwende es jedoch in Headern, um hervorzuheben, dass es sich um eine Deklaration einer extern definierten Funktion handelt, und um Symmetrie mit diesen (seltenen) Fällen herzustellen, in denen eine globale Variable im Header deklariert ist.

Die Menschen können und tun dies nicht; Ich gehe mit den lokalen Regeln um - aber wenn ich der extern bin, ist das extern in einem Header enthalten.


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.


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 ++).





c