2012-05-30 3 views
49

Ich erhalte einen Fehler aus dem folgenden Code mit C++.Statische Funktion deklariert, aber nicht in C++ definiert

Main.cpp

#include "file.h" 

int main() 
{ 
    int k = GetInteger(); 
    return 0; 
} 

file.h

static int GetInteger(); 

File.cpp

#include "file.h" 

static int GetInteger() 
{ 
    return 1; 
} 

Der Fehler erhalte ich:

Error C2129: static function 'int GetInteger(void)' declared but not defined. 

Ich habe den berühmten Artikel "Organizing Code File in C and C++", lesen, aber nicht verstehen, was mit diesem Code falsch ist.

+2

Wie verknüpfen Sie es? "gcc -o Test Main.cpp File.cpp -lstdC++" oder irgendwo in XCode/VisualStudio/Eclipse? –

+1

Was @ViktorLatypov sagte. Zeig uns, wie du es kompilierst. – Brady

+0

Ich benutze Visual Studio. – Sait

Antwort

92

In C++, static im globalen/Namespace-Bereich bedeutet, dass die Funktion/Variable nur in der Übersetzungseinheit verwendet wird, in der sie definiert ist, nicht in anderen Übersetzungseinheiten.

Hier versuchen Sie, eine statische Funktion von einer anderen Übersetzungseinheit (Main.cpp) als die zu verwenden, in der sie definiert ist (File.cpp).

Entfernen Sie die static und es sollte gut funktionieren.

19

ändern

static int GetInteger(); 

zu

int GetInteger(); 

static in diesem Fall gibt die Methode interne linkeage, was bedeutet, dass Sie nur in der Übersetzungseinheit verwenden können, wo Sie es definieren.

Sie definieren es in File.cpp und versuchen, es in main.cpp zu verwenden, aber Haupt haben keine Definition für sie, da Sie es static erklärt.

1

Funktionen, die als statisch arelocal zur enthaltenen Datei deklariert sind. Daher müssen Sie die Funktion in der gleichen Datei wie die, die sie aufrufen, definieren. Wenn Sie es aus einer anderen Datei aufrufen möchten, dürfen Sie es NICHT als statisch deklarieren.

2

Wenn alles in der gleichen Übersetzungseinheit ist, sollte es funktionieren. Sie haben File.cpp wahrscheinlich nicht in dieselbe Einheit wie Main.cpp kompiliert.

g++ -Wall File.cpp Main.cpp 

Wenn jede Datei separat kompiliert wird, muss die Funktion extern gemacht werden, um von einer verschiedenen Übersetzungseinheit verwendet werden.

extern int GetInteger(); 

die die gleichen wie

int GetInteger(); 
+0

Er benutzt Visual Studio, nicht g ++ – Brady

6

Da in diesem Fall ist, bedeutet static, dass der Name der Funktion interne Bindung aufweist; dass GetInteger in einer Übersetzungseinheit nicht in einer anderen Übersetzungseinheit steht zu GetInteger. Das Schlüsselwort static ist überladen: in einigen Fällen wirkt sich dies auf die Lebensdauer und in anderen auf die Bindung aus. Es ist besonders verwirrend hier, denn "statisch" ist auch der Name einer Lebensdauer. Funktionen und Daten, die im Namespace-Bereich deklariert sind, haben immer eine statische Lebensdauer von ; Wenn static in ihrer Deklaration angezeigt wird, verursacht interne Bindung statt extern.

1

Von meinem Verständnis, statische Funktionen sind Name Mangled mit dem Dateinamen, in dem sie definiert sind, wenn Sie file.h in main.cpp enthalten, GetInteger() erhalten mangled mit main.cpp, obwohl Sie GetInteger() in definiert haben file.cpp, aber da es statisch ist, wird es auch gemangelt und der Linker kann die Definition von GetInteger() nicht finden, da keine Funktion dieses Namens existiert.

Ich glaube, Lektion gelernt ist nicht statische Funktionen in Headerfile deklarieren als nicht Teil der Schnittstelle sein sollen.