2012-03-14 41 views
9

Tengo un código repartido en tres archivos y me gustaría usar un cuarto archivo "gloabls" para almacenar algunas constantes físicas como el valor de pi. Esto evitaría las definiciones repetitivas de pi = 4*atan(1.0). Después de hurgar, lo que he intentado es crear un archivo global de cabecera:C++ Variables globales en varios archivos

/*globals.h*/ 
extern double g_pi; 

y un archivo CPP mundial:

/*globals.cpp*/ 
#include "math.h" 
#include "globals.h" 
double g_pi = 4*atan(1.0); 

Entonces incluir estos archivos en mis archivos principales:

/*mainFile.cpp*/ 
//Include math and other libraries 
#include globals.h" 
int main() { 
/* 
.... 
*/ 
double x = 2*g_pi 
/* 
.... 
*/ 
} 

Esto me da un error de referencia indefinido para g_pi. Estoy usando un compilador g ++ en Ubuntu. ¡Con suerte es una solución simple! Tus sugerencias son muy apreciadas. Si se necesitan más detalles, estaré encantado de proporcionarlos.

+0

El problema puede residir en la forma en que construye el ejecutable, por lo que debe agregar lo que sea que use para hacerlo a su pregunta (Makefile, g ++ command line ...). – alexisdm

+0

¿Puede incluir el comando exacto que ejecuta para compilar? Y el mensaje de error exacto? – JaredC

Respuesta

12

Puede simplemente usar M_PI del include (también hay otras constantes).

Editar: su configuración es correcta. Tengo un ejemplo de trabajo minmal:

globals.h

extern double g_tst; 

globals.cpp

#include "globals.h" 
double g_tst = 4.0; 

main.cpp

#include "globals.h" 
#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
fprintf (stderr, "g_tst = %lf \n", g_tst); 
return 0; 
} 

El problema está dentro de su buildsystem

Ver wikipedia

1

g_pi musst no se declarará extern en una unidad de traducción. Se puede usar un pequeño #define para este

en globals.cpp

#define MY_EXTERN_CPP 

en /*globals.h

#ifdef MY_EXTERN_CPP 
    #define MY_CONFIGURATION_EXTERN 
#else 
    #define MY_CONFIGURATION_EXTERN extern 
#endif 

MY_CONFIGURATION_EXTERN double g_pi; 

por lo g_pi será extern en todas las unidades de traducción que lo incluye excepto globals.cpp

+0

oh, acabo de ver que este no es su problema :-) – Smittii

2

El orden de los enlaces podría ser el problema. Intente vincular el archivo de objeto global como el último.

+1

No puede ser el problema. El enlazador _debe_ manejar cualquier orden, ya que C++ permite el uso bidireccional de globales. P.ej. A.cpp define 'int a' y usa' b', mientras que B.cpp usa 'a' y define' int b'.Esto debe vincularse y, obviamente, un archivo debe preceder al otro en el orden del enlace. – MSalters

6

Creo que el problema es que tienes #include gobals.h en lugar de #include globals.h. Esto le daría las referencias indefinidas porque no está insertando globals.h. El precompilador de C++ no falla cuando no puede encontrar un archivo de encabezado. En cambio, obtienes un mensaje de referencia indefinido en la compilación.