2009-07-02 10 views
5

Nicht Inline-Funktion in Header-Datei mitLinker Fehler bei Nicht-Inline-Funktion in der Header-Datei definiert?

Wachen definiert
#if !defined(HEADER_RANDOM_H) 
#define HEADER_RANDOM_H 
void foo() 
{ 
//something 
} 
#endif 

Ergebnisse in Linker-Fehlern: Bereits in someother.obj Datei die Funktion Inline funktioniert gut zu machen definiert, aber ich bin zu verstehen, nicht in der Lage, warum die Funktion bereits erroring im ersten Fall.

Antwort

9

Wenn der Header in mehr als einer Quelldatei enthalten ist und die Funktion nicht als "Inline" gekennzeichnet ist, haben Sie mehr als eine Definition. Die Include-Wächter verhindern nur mehrfache Einschlüsse in der gleichen Quelldatei.

+0

Ya danke ......... – yesraaj

+0

Ich würde auch unterstreichen, dass das Inline-Schlüsselwort nicht notwendig ist, wenn man über Klassen spricht, die in der Klassendeklaration definiert sind http://stackoverflow.com/a/145952/ 2436175 – Antonio

4

Da es nicht inline ist, hat jede Übersetzungseinheit eine eigene Kopie der Funktion, die dazu führt, dass die Funktion mehrfach definiert wird.

7

Sie verletzen the one definition rule. Wenn Sie eine Funktion direkt in der Kopfzeile definieren möchten, müssen Sie sie als inline markieren. Dadurch kann die Funktion mehrfach definiert werden. Beachten Sie auch, dass inline keine andere Bedeutung hat, insbesondere zwingt es den Compiler nicht zu Inline-Aufrufen (entgegen der landläufigen Meinung).