2016-09-27 5 views
0

ich einige Konstanten inC++ mehrere Definition mit konst Verknüpfung Fehler deklariert in .h

Constanst.h

#ifndef __CONSTANTS_H__ 
#define __CONSTANTS_H__ 

namespace A{ 
    namespace B{ 

    const int FIRST = 1; 
    const int SECOND = 2; 
    } 
} 
#endif 

ich diese Datei bin auch aus 2 verschiedenen CPP definiert bin mit (A.cpp und B.cpp)

gcc Version 3.2.3 gibt mir "multiple Definition" Verknüpfungsfehler

ich löse das Problem nur durch einen anderen "file.h" einschließlich der "constants.h" und Decla umfasst res die gleichen Konstanten wie "extern"

Kann jemand erklären warum? Ich sollte dies ein Problem war in C, C++ nicht

+1

hinzufügen Header Wächter oder #pragma einmal – Sugar

+0

@Sugar Ich denke, das würde nicht helfen. – Danh

+0

Welcher Art sind diese Konstanten? Wenn Sie Variablen in einer Headerdatei deklarieren, werden sie in jeder Kompilierungseinheit, die diesen Header enthält, instanziiert. Es gibt eine Reihe von Möglichkeiten, aber normalerweise, wenn Leute die Variablen (konstant oder nicht) in einem Header deklarieren, definieren sie _ sie in einer .c Datei. Ihr 'extern' verspricht nur dem Compiler, dass die Variablen an anderer Stelle definiert sind, und der Linker erwartet, dass sie irgendwo unter den kompilierten Objekten zu finden sind. –

Antwort

0

mit g ++ Version 4.3.4:

constants.h:5: error: ISO C++ forbids declaration of `FIRST' with no type 

nach Art Zugabe int, es funktioniert.

Also vielleicht sollten Sie einen neueren Compiler verwenden? Benutze g ++ anstelle von gcc?

+0

Die Dateien sind A.cpp und B.cpp, sollte es nicht dasselbe mit gcc oder g ++ sein? – ellysisland

+0

Vielleicht nicht: http://stackoverflow.com/questions/172587/what-is-the-difference-between-g-and-gcc. Anyway: Bitte versuche es mit einer neueren Version! – Rene

+0

Entschuldigung ich benutze g ++, aber die Maschine ist alt RHEL 3, so kann ich Compiler-Version nicht ändern, trotzdem sehe ich das Problem kann von der Compiler-Version abhängen – ellysisland

Verwandte Themen