Const und schwaches Attribut mit C ++ - Code

8

Ich kann die folgenden Kompilierungsfehler nicht verstehen.

Die erste Datei ist eine Kopfzeile, test_weak.h :

%Vor%

Zweite Datei ist die Hauptdatei test.cpp :

%Vor%

Zum Kompilieren starte ich: g++ -include test_weak.h test.cpp -o test

Das Ergebnis der Kompilierung lautet:

%Vor%

Ich kann diesen Code erfolgreich ausführen, indem ich die cpp-Erweiterung durch die c-Erweiterung in der Testquelldatei und mit gcc anstelle von g ++ ersetze. Ich bin auch in der Lage, diesen Fehler zu beheben, indem ich das schwache Attribut entferne oder das zweite const entferne. Also ja, ich kann den Kompilierungsfehler beheben, aber nein, um den Grund des Problems hier zu verstehen.

Zum Beispiel diese Zeile kompilieren ohne Probleme:

%Vor%

Warum kann ich ein const char* const + schwaches Attribut nicht mit c ++ verwenden?

    
ArthurLambert 21.10.2013, 10:10
quelle

2 Antworten

10

Das weak -Attribut teilt dem Linker mit, wie er mit mehreren umgehen soll Definitionen derselben Entität in verschiedenen Übersetzungseinheiten. In C ++ muss die Entität extern sein, um relevant zu sein Verbindung - das ist, was der Linker mit "öffentlich" meint. In C ++, eine Variable, die selbst const hat interne Bindung durch Standard. Was Sie wahrscheinlich wollen, ist:

%Vor%

Formal wäre dies ein undefiniertes Verhalten in C ++ (ohne die __attribute__ , was nicht C ++ ist. Der Zweck der Schwachen Attribut ist es zu erlauben, mit allen Instanzen, die das selbe teilen Speicher (und es wird zu undefiniertem Verhalten führen, oder zumindest nicht spezifiziert, wenn eine der Instanzen eine andere hat Initialisierer.

Eigentlich: Was Sie wahrscheinlich wollen, ist:

%Vor%

Es hat keinen Sinn, den Zeiger umsonst einzuführen.

BEARBEITEN:

Beachten Sie, dass dies einer der Unterschiede zwischen C und C ++ ist. Im C, das const hat keinen Einfluss auf die Verknüpfung.

    
James Kanze 21.10.2013, 10:37
quelle
4

In C ++ erhält eine Variable, die als const deklariert und nicht explizit als extern deklariert ist, eine interne Verknüpfung (dh als static deklariert). Offenbar kann dies nicht mit dem Attribut weak kombiniert werden.

C hat diese Regel nicht, daher erhält das Symbol eine externe Verknüpfung und somit kann das Attribut darauf angewendet werden, wenn Sie dies als C-Code kompilieren.

    
Angew 21.10.2013 10:36
quelle

Tags und Links