2016-06-02 20 views
5

Dieses Problem ist in der G ++ vor -std=c++14 reproduzierbar. Ein Verbindungsfehler wird aufgrund der hervorgehobenen const in den folgenden Codes generiert. Es verschwindet, wenn die RHS const entfernt wird.Verknüpfungsfehler aufgrund der Konstanz des Zeigerarrays in C++ 03/C++ 11

/* main.cpp */ 
const char* const arr[2] = {"Hello", "World"}; 
//   ^^^^^ 
int main() {} 

und

/* foo.cpp */ 
extern const char* const arr[2]; 
//     ^^^^^ 
const char* foo() { return arr[0]; } 

Beim Kompilieren: g++ [-std=c++11] main.cpp foo.cpp gibt es folgende Verknüpfungsfehler:

In function `foo()': undefined reference to `arr' 

Ist es ein Compiler Fehler oder eine Sprache Begrenzung/Funktion?

+3

'const' Variablen im Namensraum scope [sind implizit' static'] (http://stackoverflow.com/questions/33402177/const-global-variable-in-namespace), es sei denn, Sie fügen 'extern' hinzu. Ich bin mir nicht sicher, warum sich das Verhalten mit '-std = C++ 14' ändert. – Quentin

+0

Sollte 'extern const char * const arr [2];' in einer Header-Datei sein, die sowohl 'main.cpp' als auch' foo.cpp' enthalten? – NathanOliver

+0

@Quentin Ich bin mir nicht sicher, warum OP sagt vor C++ 14, erzeugt g ++ 5.1.0 Fehler in jedem Modus (C++ 14 C++ 17), sollte Ihr Kommentar die Antwort sein – Slava

Antwort

3

Wie Quentin bemerkt, ist der Entwurf der n4296 ausdrücklich darüber in Kapitel 3.5 Programm und Verknüpfung [basic.link] §3 (betonen Mine)

A name having namespace scope (3.3.6) has internal linkage if it is the name of
(3.1) — a variable, function or function template that is explicitly declared static; or,
(3.2) — a variable of non-volatile const-qualified type that is neither explicitly declared extern nor previously declared to have external linkage;

Wenn Sie arr erklären const zu sein, es ist implizit gegebene interne Verbindung. Die Lösung ist trivial:

/* main.cpp */ 
extern const char* const arr[2] = {"Hello", "World"}; 

Aber am beste Praxis würde empfehlen extern const char* const arr[2]; in einem Header in allen Dateien korrekt mit arr enthalten, um zu haben, um die Erklärung zu teilen und dann in einer dieser Dateien const char* const arr[2] = {"Hello", "World"}; hinzufügen, effektiv wodurch man