Forum: Compiler & IDEs Verständnisfrage: Externe Variable in C und C++


von Frank Roggel (Gast)


Lesenswert?

Hallo zusammen,

1. Fall:
Ich habe eine Variable in "datei1.c" definiert.
Wenn ich diese Variable in "datei2.cpp" verwenden will, geht das mit
1
extern "C" uint8_t Variable;

2. Fall
Ich habe eine Variable in "datei1.cpp" definiert (außerhalb einer 
Klasse).
Wie kann ich diese Variable in "datei2.cpp" verwenden?
Sowohl
1
extern uint8_t Variable;
also
1
extern "C" uint8_t Variable;
ergeben den Linkerfehler "undefined reference to Variable".
Oder ist dieser Fall gar nicht vorgesehen?

von Peter (Gast)


Lesenswert?

Globale Variablen sind auch in C++ möglich, wenn auch schlechter Stil.

Zeig mal den ganzen Code. Möglicherweise ist die Variable in datei1.cpp 
const oder innerhalb eines Namespaces?

von Frank Roggel (Gast)


Lesenswert?

Peter schrieb:
> Möglicherweise ist die Variable in datei1.cpp
> const oder innerhalb eines Namespaces?

Was hat const damit zutun?

von Peter (Gast)


Lesenswert?

Eine Variable mit const ohne extern hat in C++ internal Linkage, in C 
external Linkage.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Frank Roggel schrieb:
> extern uint8_t Variable;

Deklaration in einem C-Modul.

> extern "C" uint8_t Variable;

Deklaration in einem C++-Modul, falls das Objekt geneinsam von C- und 
C++-Modulen verwendet wird. Falls das Objket aussschließlich von C++ 
verwendet wird, kann das "C" entfallen.  Wird ei Header gemeinsam von 
C++ und C Modulen verwendet, findet sich i.d.R. #ifdef __cplusplus 
darin, z.h. in datei1.h:
1
#ifdef __cplusplus
2
extern "C" uint8_t var1;
3
#else
4
extern uint8_t var1;
5
#endif
6
7
#ifdef __cplusplus
8
extern "C" {
9
#endif
10
11
extern uint8_t var2;
12
13
#ifdef __cplusplus
14
}
15
#endif

> ergeben den Linkerfehler "undefined reference to Variable".

Es fehlt die Definition des Objekts, entweder weil die Definition in 
Quelle (effektiv) fehlt oder wegen eines Problems in der Build-Umgebung, 
z.B. weil datei1.o nicht gegen die Anwendung gelinkt wird.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.