2016-11-09 7 views
1

Ich versuche, einen globalen Namespace in einer Header-Datei global.h zu definieren.Mehrfache Definition bei Verwendung von Namespace in Header-Datei

... 
namespace g { 
    const int g_0 = 0; 
    const int g_1 = 1; 
} 
... 

wenn man sich nur #include "global.h" in anderer CPP-Datei Compiler

multiple definition of g::g_0 
multiple definition of g::g_1 

einem Fehler gibt Wenn ich versuche, zum Beispiel g_0 und g_1 in anderen CPP-Dateien zu verwenden.

int g_0_copy = g::g_0; 
int g_1_copy = g::g_1; 

Es wirft einen Fehler zu sagen:

ISO C++ forbids in-class initialization of non-const static member... 

Gibt es etwas Besonderes, wenn Namespace globalen Variable zu deklarieren? (Ich muss C++ 98 in diesem Fall verwenden)

+0

Der Compiler gibt einen Fehler aus, wenn der Namespace zweimal in derselben Kompilierungseinheit enthalten ist. Ansonsten haben die Konstanten eine statische Verknüpfung. –

+1

Dumme Frage. Haben Sie Wächter in der Kopfzeile? – StoryTeller

+1

Benötigen Sie vollen Code. Der Hinweis über "In-Class-Initialisierung" sagt mir, dass es mehr gibt, als Sie uns zeigen. – SergeyA

Antwort

2

Wenn alle Ihre Globals const sind, benötigen Sie wahrscheinlich nur Wächter.

#ifndef GLOBAL_H 
#define GLOBAL_H 

... 
namespace g { 
    const int g_0 = 0; 
    const int g_1 = 1; 
} 
... 

#endif // GLOBAL_H 

const global variables have internal linkage unless explicitly declared extern, so werden sie die Verknüpfung Fehler so lange nicht verursachen, da sie nur einmal pro Übersetzungseinheit definiert sind. Jede Übersetzungseinheit hat ihre eigene Kopie jeder globalen Konstante, die der Compiler nach Möglichkeit optimieren kann oder auch nicht.


Wenn einige Ihrer globalen Variablen sind nicht const jedoch wird es ein bisschen komplizierter.

#ifndef GLOBAL_H 
#define GLOBAL_H 

... 
namespace g { 
    const int g_0 = 0; 
    const int g_1 = 1; 

    int g_2 = 2; // Oh, boy. 
} 
... 

#endif // GLOBAL_H 

Da diese Variable standardmäßig externe Bindung hat, wird es ein Verbindungsfehler aufgrund von mehreren Übersetzungseinheiten, die verschiedene Variablen verursachen g_2 benannt. Die Lösung besteht darin, die Variablen extern im Header zu deklarieren und ihre tatsächlichen Definitionen in eine Quelldatei zu platzieren.

// global.h 
#ifndef GLOBAL_H 
#define GLOBAL_H 

... 
namespace g { 
    const int g_0 = 0; 
    const int g_1 = 1; 

    extern int g_2; // Oh, boy. 
} 
... 

#endif // GLOBAL_H 

// --- 

// global.cpp 
namespace g { 
    int g_2 = 2; 
} 

Das heißt, wie SergeyAin the comments wies darauf hin, die Fehlermeldung signalisiert, dass Sie bekam, dass es mehr zu diesem:

ISO C++ forbids in-class initialization of non-const static member... 

ich nichts dazu sagen kann, ohne zu wissen, was Code verursacht es.

Verwandte Themen