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.
Sie die Tatsache, dass die mehreren Definitionsprobleme gehören zu fehlen * mehrere * Übersetzungseinheiten, nicht auf 1 Übersetzungseinheit. –
@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
Die wirkliche Antwort besteht nicht darin, Definitionen in Kopfzeilen zu setzen. Dann erhältst du nicht mehrere Definitionen! –