Ich kann die folgenden Kompilierungsfehler nicht verstehen.
Die erste Datei ist eine Kopfzeile, test_weak.h
:
Zweite Datei ist die Hauptdatei test.cpp
:
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?
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:
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.
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.