2012-05-30 13 views
49

Recibo un error del siguiente código con C++.Función estática declarada pero no definida en C++

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; 
} 

El error que consigo:

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

He leído el famoso artículo "Organizing Code File in C and C++", pero no entienden lo que está mal con este código.

+2

¿Cómo la vincula? "gcc -o Prueba Main.cpp File.cpp -lstdC++" o en algún lugar de XCode/VisualStudio/Eclipse? –

+1

Lo que dijo @ViktorLatypov. Muéstranos cómo lo estás compilando. – Brady

+0

Uso Visual Studio. – Sait

Respuesta

92

En C++, static en ámbito global/espacio de nombres significa que la función/variable solo se usa en la unidad de traducción donde está definida, no en otras unidades de traducción.

Aquí está tratando de usar una función estática de una unidad de traducción diferente (Main.cpp) que aquella en la que está definida (File.cpp).

Eliminar el static y debería funcionar bien.

19

Cambio

static int GetInteger(); 

a

int GetInteger(); 

static en este caso da la linkeage interna método , lo que significa que sólo se puede utilizar en la unidad de traducción en el que lo define.

Lo define en File.cpp y trata de usarlo en main.cpp, pero main no tiene una definición para él, ya que lo declaró static.

1

funciones declaradas como arelocal estática al archivo que contiene. Por lo tanto, debe definir la función en el mismo archivo que los que lo llaman. Si desea hacer que se pueda llamar desde otro archivo, NO debe declararlo como estático.

2

Si todo está en la misma unidad de traducción debería funcionar. Probablemente no compila File.cpp en la misma unidad que Main.cpp.

g++ -Wall File.cpp Main.cpp 

Si cada archivo se compila por separado la función debe hacerse extern para ser utilizado desde una unidad de traducción diferente.

extern int GetInteger(); 

que es el mismo que

int GetInteger(); 
+0

Está usando Visual Studio, no g ++ – Brady

6

Porque en este caso, static significa que el nombre de la función tiene enlace interno; que GetInteger en una unidad de traducción no está relacionado a GetInteger en cualquier otra unidad de traducción. La palabra clave static está sobrecargada: en algunos casos, afecta la duración y, en otros, vinculante. Es particularmente confuso aquí, porque "estático" es también el nombre de una duración de . Las funciones y los datos declarados en el ámbito del espacio de nombres, siempre tienen una vida útil estática; cuando static aparece en su declaración, provoca un enlace interno, en lugar de externo.

1

Desde mi entender, son funciones estáticas nombre revuelto con el nombre de archivo en el que se definen por lo que cuando se incluye en file.h main.cpp, getInteger() obtener destrozado con main.cpp pesar de que han definido getInteger() en file.cpp pero dado que es estático, también se destroza y el enlazador no puede encontrar la definición de GetInteger() ya que no existe ninguna función con este nombre.

Creo que la lección aprendida es no declarar funciones estáticas en el archivo de cabecera ya que no están destinadas a ser parte de la interfaz.

Cuestiones relacionadas