Forum: PC-Programmierung C/C++: Merkwürdiger Scope-Effekt


von Uhu U. (uhu)


Lesenswert?

Ich versuche gerade, eine Sammlung von C-Modulen (per gcc-Option -x c++) 
mit dem C++-Compiler zu übersetzen.

Die Syntax ist so weit zurechtgebogen, dass sich alle Dateien sowohl in 
C, als auch in C++ fehlerfrei übersetzen lassen.

Die per C-Compiler erzeugten .o-Files lassen sich auch fehlerfrei 
linken. Nicht so die C++-Objektfiles:

In einem der Module steht folgende Deklaration:
1
typedef const struct {
2
   <liste von funktionspointerntypen>
3
} UARTlinkTable, *UARThandle;
4
5
UARTlinkTable BT05uart = {
6
   <liste von funktionspointern>
7
};
8
9
UARThandle activeUart = &BT05uart;

Der Linker findet in den C++-Objektfiles die Definition für activeUart 
nicht.

Wenn ich mir mit dem Tool nm von Linux die Symboltabellen der .o-Files 
ansehe, fällt auf, dass

  - in der C-Version das Symbol activeUart als global getaggt ist, aber
  - in der C++-Version als lokal

Folgerichtig findet der Linker beim C++-linken activeUart nicht.

Warum wird
1
UARThandle activeUart = &BT05uart;
von C++ als lokal angesehen?

von Sven B. (scummos)


Lesenswert?

Hmm, was ist denn das Ziel der Übung? Warum nicht extern "C" {}?

C und C++ sind nicht mehr wirklich kompatibel ...

von Uhu U. (uhu)


Lesenswert?

Sven B. schrieb:
> Warum nicht extern "C" {}?

Variablen werden in C++ nicht gemangelt, extern "C" hat darauf keine 
Wirkung.

Das Problem hängt möglicherweise mit dem const zusammen.

> Hmm, was ist denn das Ziel der Übung?

Ich will einen einfachen Simulator für 8-Bit-AVRs stricken, der einfach 
in Form einiger Quellmodule und einem speziellen Header zu dem 
C-Programm dazukompiliert wird. Die I/O-Register lassen sich am 
einfachsten mit C++ emulieren.

Nachtrag:
Die Lösung steht hier: 
https://stackoverflow.com/questions/998425/why-does-const-imply-internal-linkage-in-c-when-it-doesnt-in-c

: Bearbeitet durch User
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.