2011-01-14 10 views
2

In C++, const Variablen sind implizit von anderen Übersetzungseinheiten versteckt. Ist das möglich, das zu verhindern?Zugriff const Variablen über Übersetzungseinheiten

+0

Verhindern, dass eine interne Verbindung besteht, oder verhindern, dass alle standardmäßig eine interne Verbindung haben? –

+2

@Steve: Nur einer. Ich möchte nicht die Sprachregeln ändern ;-) – fredoverflow

+0

mehr Spaß über die Verknüpfung von Variablen: http://StackOverflow.com/Questions/3538807/Klicken-von-Variösen-Konst-Static-Variablen –

Antwort

7

Ja, Präfix der Definition mit extern zB.

extern const int x = 10; 
3

Verwenden Sie das extern Stichwort:

extern const int x = 10; 

Diese die Variable zwingt externe Bindung zu haben.

Für Namespace-Scope-Variablen ist dies normalerweise der Standardwert, und Sie verwenden static (oder besser: einen anonymen Namespace), um interne Verknüpfungen zu erzwingen.

Ich wusste nicht wirklich, dass Namespace-Bereich const Variablen interne Verknüpfung standardmäßig haben, bis ich Ihre Frage gelesen und es ausprobiert, so vielen Dank dafür. Lerne jeden Tag etwas Neues!

3

können Sie mit Hilfe des extern Schlüsselwort erreicht werden:

// a.cpp 
extern const int x = 10; // definition 
// b.cpp 
extern const int x;  // declaration 

Die Wirkung dieser haben wird, ist, dass Sie nicht b, wenn der Wert der ständigen Veränderungen in a, aber auch neu zu kompilieren müssen Zeit verlieren Sie die Möglichkeit, x als Kompilierzeitkonstante innerhalb b.cpp zu verwenden (dh Sie können int array[x]; nicht schreiben).

Wenn es keinen sehr starken Grund dafür gibt, würde ich lieber die Konstante in einer Header-Datei definieren und in allen Übersetzungseinheiten enthalten, die sie benötigen;

// c.h 
const int x = 10; 
// a.cpp 
#include "c.h" 
// b.cpp 
#include "c.h" 

Sie haben alle Übersetzungseinheiten neu zu kompilieren, die mit jeder Änderung auf die Konstante abhängen, aber Sie werden es zu benutzen, bei der Kompilierung der Lage sein, in allen Übersetzungseinheiten. Die Einschränkung dieses Ansatzes besteht darin, dass der Wert der Konstante inkonsistent ist, wenn Sie die Konstante ändern und nur einige der Übersetzungseinheiten neu kompilieren (dies ist eine Verletzung der ODR).

+0

Ja, ich bin nicht sicher, warum du das tust. Setzen Sie eine Deklaration ('extern const int x;') in Ihren Header, klar, aber warum lassen Sie die Definition nicht streng in einer TU? Genau aus den Gründen, die Sie übrigens geben. :) –

Verwandte Themen