2016-09-27 7 views
1

Grundsätzlich möchte ich eine globale Konstante in Std :: Array in einer anderen Datei verwenden.Globale Konstante in C++ 11 in std :: array verwendet

Ich bin mir bewusst, dass globale Variable Frage wurde hier oft gefragt. Zum Beispiel dieser: Defining global constant in C++

Und ich persönlich bevorzuge Methode zu verwenden, 5 oder 6:

5: const int GLOBAL_CONST_VAR = 0xFF;

6: extern const int GLOBAL_CONST_VAR; und in einer Quellendatei const int GLOBAL_CONST_VAR = 0xFF;

Mein Projekt benötigt viele Konstanten, wie zB die Solarkonstante. Und einige werden für std :: array verwendet, zum Beispiel nvegetation_type, nrock_type.

Ich verwendete die Methode 5, so dass nur eine Kopfzeile für alle anderen Quelldateien verwendet wird. Aber das multiple Definition Problem entsteht, ähnlich wie: Multiple definition and header-only libraries und hier: Why aren't my include guards preventing recursive inclusion and multiple symbol definitions?

Aber das sieht aus wie nicht ein Problem in meinem Visual Studio C++ Projekt und ich habe keine Ahnung, warum noch. Ich habe Makefile unter Linux verwendet und es auch kompiliert.

Wenn jedoch I verwende Methode 6 und definieren Array in anderer Quelle Header-Datei in C++ 11 als

extern const int nvegetation_type ; 
const std::array< double, nvegetation_type > some_variable 
= { { 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 
     0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1} }; 

I Fehler wie erhalten:

error C2065: 'nvegetation_type': undeclared identifier. 

I unter der Annahme, bin, wenn ich benutze Header/Source-Ansatz, ich kann nicht direkt verweisen globale Variablen, zumindest für std :: array. Ich lese einige ähnliche Links, aber keiner hat dies erwähnt (Vielleicht meine Suche war unglücklich). http://www.learncpp.com/cpp-tutorial/42-global-variables/ Also, was ist die Lösung?

+0

Ich weiß nicht, was Sie fragen. –

+0

Ich hätte gedacht, dass dieser Fehler "undefined Bezeichner" und nicht "nicht deklarierte Bezeichner" wäre? – lfgtm

+0

Es scheint wie eine seltsame Diagnose (obwohl das Problem nicht Verknüpfung ist also Ihre vorgeschlagene Alternative ist nicht ganz richtig) –

Antwort

1

Danke für all die Kommentare und Antworten

In diesem Fall können Sie extern im Header

extern const int nvegetation_type = <value>; 

und hinzufügen. Ich denke, ich habe es mit deinen Hilfsmitteln behoben.

Verzeihen Sie mir, dass ich nicht genug Details in erster Linie zur Verfügung gestellt habe. Ich habe mir das Problem, mit dem ich zu tun hatte, nicht einfacher gezeigt. Normalerweise würde ich ein Testprojekt erstellen.

Also ist die endgültige Lösung eine gemischte Lösung. Wie oben vorgeschlagen, erfordert das std :: -Array, dass der konstante Wert in der Kompilierungsphase bekannt ist. Die in meinem Beitrag erwähnte Methode 5 ist die ideale Lösung. In diesem Fall wird nur eine Header-Datei benötigt. Es würde in std :: array verwendet werden. Der Nachteil dieses Ansatzes besteht darin, dass mehrere Kopien der Headerdatei erstellt werden.

Für andere globale Variablen können sie mit der Methode 6, den klassischen Header- und Quelldateien definiert werden.

Also habe ich die globalen Variablen in zwei Kategorien unterteilt und definieren sie jeweils mit Methode 5 und 6. Und es hat funktioniert!

1

Mit

extern const int nvegetation_type; 

Sie sagen den Compiler, die irgendwo definieren einen konstanten aber die Compiler nicht den Wert in Kompilierungsphase kennen.

Und der Compiler muss den genauen Wert der Konstanten in der Kompilierungsphase kennen, für den folgenden Befehl

const std::array< double, nvegetation_type > some_variable 

So den Fehler.

Eine einfache Lösung könnte eine Headerdatei sein, in der Sie const mit ihrem Wert deklarieren können.

const int nvegetation_type = <value>; 

(oder sogar constexpr, in count nehmen, dass Sie die Frage c++11 markiert haben) und es in jeder CPP/h-Datei, wo benötigt wird.

Der Nachteil ist, dass, wenn Sie diesen Header in viele cpp-Dateien enthalten, Ihr Programm viele nvegetation_type Konstante definieren; alle mit dem gleichen Wert, aber viele Kopien.nur in einer CPP-Datei, fügen

const int nvegetation_type; 
+0

Was ist dann die Lösung? – Chang

+0

@ChangLiao - Antwort verbessert – max66

+0

Danke, das ist eine sehr klare Erklärung. Wenn ich jedoch den letzten Teil getestet habe, stellt sich heraus, dass In diesem Fall können Sie extern in der Kopfzeile hinzufügen extern const int nvegetation_type = ; und in nur einer cpp-Datei hinzufügen const int nvegetation_type; wird das Problem der Mehrfachdefinition verursachen, also entferne ich die .cpp Datei und es hat funktioniert. @ max66 – Chang

Verwandte Themen