Ist es möglich, eine eindeutige Adresse für eine consExpr-Variable zuzuordnen, d. h. für alle Übersetzungseinheiten, in denen die Variable verfügbar ist (normalerweise über einen Header)? Betrachten Sie das folgende Beispiel:
%Vor% Kompilieren Sie a.cc
und b.cc
separat, und verbinden Sie sie mit gcc 4.7, ich sehe zwei verschiedene Adressen gedruckt. Wenn ich das Schlüsselwort extern
im Header hinzufüge, erhalte ich einen Linkerfehler duplicate symbol _foo in: a.o and b.o
, was ich irgendwie überraschend finde, weil ich dachte, dass das Hinzufügen von extern
eher dazu führen würde, dass der Compiler dieses Symbol von einem anderen Objekt importiert exportiert es aus dem aktuellen Objekt. Aber es scheint, dass mein Verständnis davon, wie die Dinge funktionieren, hier falsch ist.
Gibt es einen vernünftigen Weg, einen consExpr in einem Header deklarieren zu lassen, so dass alle Übersetzungseinheiten ihn in ihren konstanten Ausdrücken verwenden können und dass alle Übersetzungseinheiten bezüglich der Adresse dieses Symbols übereinstimmen? Ich würde etwas zusätzlichen Code erwarten, um die einzelne Übersetzungseinheit zu bezeichnen, zu der dieses Symbol gehört, genau wie bei extern
und nicht extern
Variablen ohne constexpr
.
Wenn Sie die Adresse der constexpr-Variablen verwenden müssen, deklarieren Sie sie als statische Elementvariable. Es kann auf diese Weise als konstanter Ausdruck verwendet werden (im Gegensatz zur Verwendung einer Funktion, die eine Konstante zurückgibt).
foo.hpp:
%Vor%foo.cpp:
%Vor%bar.cpp:
%Vor%main.cpp:
%Vor%Ausgabe:
%Vor%Ich denke, dass constexpr eher für Funktionen gedacht ist, deren Rückgabewert konstant ist. Sie können eine konstante Variable an den Rückgabewert einer constexpr-Funktion binden und diese stattdessen extern verfügbar machen. Zum Beispiel:
%Vor%Mein Ergebnis ist:
%Vor% Allerdings sollte es normalerweise ausreichend sein, die foo_expr
-Funktion selbst extern sichtbar zu machen, und Aufrufer würden foo_expr()
verwenden, um den Wert zu erhalten, anstatt ihn wie eine Variable zu behandeln.
Tags und Links c++ c++11 constexpr extern memory-address