extern und der XC8-C-Compiler

Vielleicht verstehe ich nicht ganz extern. Mit dem XC8 C-Compiler scheint es, als könnte ich davonkommen, ohne ihn zu verwenden.

In der Datei keypad.chabe ich eine Funktion signed char keypadGetPressedKeyLabel(void). In der Header-Datei keypad.hhabe ich:

signed char keypadGetPressedKeyLabel(void);

Ich dachte, ich müsste verwenden extern, dh:

extern signed char keypadGetPressedKeyLabel(void);

Das Projekt baut ohne extern. Und es funktioniert. Könnte das daran liegen, dass keypad.cund keypad.halle Teil des Projekts sind? Ich verwende MPLABX.

Verwenden andere Dateien keypad.h?

Antworten (4)

externist für Funktionsprototypen in .h-Dateien nicht unbedingt erforderlich - unabhängig davon, ob die Funktion tatsächlich in einer oder vielen verschiedenen .c-Dateien in Ihrem Projekt verwendet wird.
Ob Sie extern int foo(void);oder nur int foo(void);in Ihrer .h Ihr Compiler lesen wird, ist so oder so als Funktionsprototyp.

Es ist jedoch für globale Variablen erforderlich, da sie im Gegensatz zu Funktionen keine Prototypen haben.
Wenn Sie also ein int thing;in einer .c-Datei haben und es in einer anderen .c-Datei verwenden möchten, müssen Sie extern int thing;dem Compiler mitteilen, dass es „irgendwo“ in Ihrem Projekt existiert.

Richtig. Sie können die Initialisierung auch nur in die Definition der Variablen aufnehmen, z. B. int a = 0; es ist ein Fehler, dies in einer externen Deklaration noch einmal zu wiederholen, zB extern int a = 0; // Fehler

Funktionen sind in C standardmäßig extern ; Deshalb funktioniert es ohne das Schlüsselwort.

Das ist wirklich die richtige Antwort, aber ich denke, es würde auch von einer kurzen Erklärung profitieren, was extern eigentlich bedeutet.
Tolle Antworten; Der XC8-Compiler von PIC verwendet extern, um nach externen Dateien zu suchen, nicht nur als globale Deklaration.

externist wirklich ein Zeichen für den Linker, dass das Symbol in einer anderen Objektdatei definiert ist. Da Sie scheinbar nur eine Objektdatei haben, spielt es keine Rolle, ob sie vorhanden ist oder nicht.

externist für Funktionen in anderen CUs in vielen der kleineren, einfacheren Compiler weitgehend veraltet. Wenn ein Symbol lokal nicht gefunden wird, wird es in anderen CUs und Bibliotheken gesucht. Sie stellen einen Funktionsprototyp, aber nicht die eigentliche Funktion, in der CU bereit, in der Sie sie verwenden möchten.

Ist jedoch externfür Variablen erforderlich, die von CUs gemeinsam genutzt werden. Sie können keinen Prototyp für eine Variable definieren, daher externmuss das Schlüsselwort in dieser Situation verwendet werden, um das Variablenäquivalent eines Funktionsprototyps zu erstellen.