mikrocontroller.net

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


Autor: Uhu U. (uhu)
Datum:

Bewertung
0 lesenswert
nicht 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:
typedef const struct {
   <liste von funktionspointerntypen>
} UARTlinkTable, *UARThandle;

UARTlinkTable BT05uart = {
   <liste von funktionspointern>
};

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
UARThandle activeUart = &BT05uart;
von C++ als lokal angesehen?

Autor: Sven B. (scummos)
Datum:

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

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

Autor: Uhu U. (uhu)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.