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.c
habe ich eine Funktion signed char keypadGetPressedKeyLabel(void)
. In der Header-Datei keypad.h
habe 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.c
und keypad.h
alle Teil des Projekts sind? Ich verwende MPLABX.
extern
ist 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.
Funktionen sind in C standardmäßig extern ; Deshalb funktioniert es ohne das Schlüsselwort.
extern
ist 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.
extern
ist 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 extern
für Variablen erforderlich, die von CUs gemeinsam genutzt werden. Sie können keinen Prototyp für eine Variable definieren, daher extern
muss das Schlüsselwort in dieser Situation verwendet werden, um das Variablenäquivalent eines Funktionsprototyps zu erstellen.
Ignacio Vazquez-Abrams
keypad.h
?