2016-03-21 16 views
1

Ich habe den folgenden Header:Deklarieren und definieren Sie eine Funktion in einem Namespace?

#ifndef MY_H_ 
#define MY_H_ 

namespace A { 
void f() { 
// do something 
} 
} 
#endif 

Allerdings, wenn ich zusammengestellt, ich habe Fehler wie mehrere Definition von A :: f(). Ich dachte, dass die Prüfung #ifndef ausreicht, um doppelte Definitionen in einer Übersetzungseinheit zu vermeiden. Vielleicht vermisse ich etwas?

Vielen Dank im Voraus.

+2

Sie die Tatsache, dass die mehreren Definitionsprobleme gehören zu fehlen * mehrere * Übersetzungseinheiten, nicht auf 1 Übersetzungseinheit. –

+0

@KerrekSB danke für Ihre schnelle Antwort. Ja, ich verstehe was du meinst. Ich kann es statisch machen, um das Problem zu vermeiden. Inline funktioniert auch für meinen Compiler. Aber weil Inline nur ein Hinweis auf den Compiler ist, kann der Compiler es ignorieren und ich werde immer noch mit mehreren Definitionen enden. Oder Compiler ist garantiert in diesem Fall inline nicht zu ignorieren? – Hei

+0

Die wirkliche Antwort besteht nicht darin, Definitionen in Kopfzeilen zu setzen. Dann erhältst du nicht mehrere Definitionen! –

Antwort

2

inline Spezifizierer vor der Funktionsdefinition hinzufügen:

#ifndef MY_H_ 
#define MY_H_ 

namespace A { 
inline void f() { 
// do something 
} 
} 
#endif 
+0

Inline funktioniert für meinen Compiler. Aber weil Inline nur ein Hinweis auf den Compiler ist, kann der Compiler es ignorieren und ich werde immer noch mit mehreren Definitionen enden. Oder Compiler ist garantiert in diesem Fall inline nicht zu ignorieren? – Hei

+0

Gemäß dem ersten Punkt in der Beschreibung unter dem obigen Link: "1) Es kann mehr als eine Definition einer Inline-Funktion im Programm geben, solange jede Definition in einer anderen Übersetzungseinheit erscheint. Beispielsweise kann eine Inline-Funktion definiert sein in einer Header-Datei, die # in mehreren Quelldateien enthalten ist. " Inline als Optimierungshinweis für den Compiler ist jetzt veraltet. – pmed

+0

Danke für Ihre Antwort. Sie meinen also im neuen C++ - Standard (C++ 11 oder C++ 14), dass der Compiler den Inline-Code korrekt verarbeitet und nicht inline als Hinweis interpretiert? – Hei

0

Sie sollten Funktionen in der Headerdatei deklarieren, aber in Ihrer cpp-Datei definieren. Wenn Sie diese Header-Datei aus mehreren Übersetzungseinheiten einbeziehen (was am wahrscheinlichsten ist), dann sind mehrere Implementierungen für verschiedene Übersetzungseinheiten verfügbar. Jede Ihrer cpp-Dateien, die diesen Header enthalten, wird eine Implementierung von f haben. Auf diese Weise ist es zweideutig, wenn f aufgerufen werden soll. Indem die Implementierung in eine cpp-Datei eingefügt wird, kann sie so verknüpft und verwendet werden. Aber es gibt nur eine Implementierung, die es eindeutig macht.

So sollte Ihre Header-Datei sein:

#ifndef MY_H_ 
#define MY_H_ 

namespace A 
{ 
    void f(); // declaration only 
} 

#endif 

und Quelldatei:

#include "myHeader.h" 

namespace A 
{ 
    void f() 
    { 
     // some implementation 
    } 
} 

Dann sollten Sie in Ordnung sein. Das würden Sie normalerweise mit all Ihren Funktionen tun. Die einzigen Ausnahmen sind inline Funktionen/Methoden oder Templates, aber dies würde den Rahmen dieser Frage sprengen.

Verwandte Themen