In C++, const
Variablen sind implizit von anderen Übersetzungseinheiten versteckt. Ist das möglich, das zu verhindern?Zugriff const Variablen über Übersetzungseinheiten
Antwort
Ja, Präfix der Definition mit extern
zB.
extern const int x = 10;
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!
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).
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. :) –
- 1. String Literal Adresse über Übersetzungseinheiten
- 2. Problem beim Zugriff auf statische const-Variablen über Klassenmemberfunktionen
- 3. Const-Methode Zugriff auf statische Variablen
- 4. Separate Übersetzungseinheiten
- 5. machen C++ Variablen const
- 6. C++: Warum bevorzugt gcc beim Zugriff auf operator [] nicht-const über const?
- 7. consExpr const vs constexpr Variablen?
- 8. Vermeidung statischer const Variablen überall
- 9. const vs conexpr auf Variablen
- 10. Bevorzugen constexpr über const
- 11. C++ statischer const-Zugriff durch einen Nullzeiger
- 12. Wann werden globale statische const-Variablen initialisiert?
- 13. Warum erhalten einige const-Variablen, die auf einige exportierte const-Variablen verweisen, den Wert 0?
- 14. Verwenden von Plunker, Zugriff auf Variablen über die Browserkonsole
- 15. Zugriff auf Bytes einer __m128-Variablen über Union Legal?
- 16. Zugriff auf Userscript-Variablen über die Google Chrome-Konsole
- 17. Zugriff auf globale Variablen über Pakete in Go
- 18. Korrektes Speichern von funktionspezifischen const Optionen/Variablen?
- 19. Sind const-Variablen im schreibgeschützten Speicher abgelegt?
- 20. ES6/JavaScript - Variablen ohne let/const deklarieren
- 21. Entfernen Const-Ness aus einer Variablen
- 22. Zugriff auf DataLayer-Variablen
- 23. Zugriff auf statische Variablen
- 24. Bootstrap4: Zugriff auf Variablen?
- 25. Zugriff auf private Variablen
- 26. Wie setze ich globale const-Variablen in Python?
- 27. Javascript äußeren Umfang variablen Zugriff
- 28. Angular2; typescript - Zugriff auf Variablen
- 29. Globaler Zugriff vs. lokale Variablen
- 30. PostSharp Zugriff auf lokale Variablen
Verhindern, dass eine interne Verbindung besteht, oder verhindern, dass alle standardmäßig eine interne Verbindung haben? –
@Steve: Nur einer. Ich möchte nicht die Sprachregeln ändern ;-) – fredoverflow
mehr Spaß über die Verknüpfung von Variablen: http://StackOverflow.com/Questions/3538807/Klicken-von-Variösen-Konst-Static-Variablen –