2012-03-14 4 views
9

3 개의 파일에 걸쳐 코드가 있고 네 번째 "gloabls"파일에 pi 값과 같은 일부 물리적 상수를 저장하고 싶습니다. 이것은 pi = 4*atan(1.0)의 반복적 인 정의를 피할 것입니다.여러 파일에 걸친 C++ 전역 변수

/*globals.h*/ 
extern double g_pi; 

및 글로벌 CPP 파일 :

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

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

내가 내 주요 파일이 파일을 포함 I 글로벌 헤더 파일을 만드는 시도했다, 주위를 파고 후

이렇게하면 g_pi에 대한 정의되지 않은 참조 오류가 발생합니다. 우분투에서 g ++ 컴파일러를 사용하고 있습니다. 바라기를 그것의 간단한 고침! 귀하의 제안은 높이 평가됩니다. 더 자세한 내용이 필요하다면 나는 그들을 기꺼이 제공 할 것입니다.

+0

문제는 실행 파일을 빌드하는 방법과 관련되어 있으므로 질문에 사용하는 모든 것을 추가해야합니다 (Makefile, g ++ 명령 줄 ...). – alexisdm

+0

컴파일 할 때 실행할 정확한 명령을 포함 할 수 있습니까? 그리고 정확한 오류 메시지? – JaredC

답변

12

간단히 include의 M_PI를 사용할 수 있습니다 (다른 상수도 있음).

편집 : 설정이 올바른 것입니다. 나는 작업 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; 
} 

문제는 buildsystem

을 내

012를 참조하십시오.

1

g_pi musst는 하나의 번역 단위로 extern으로 선언 할 수 없습니다. 당신은 /*globals.h

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

MY_CONFIGURATION_EXTERN double g_pi; 

에 globals.cpp이

에 대한

#define MY_EXTERN_CPP 

을 작은 #DEFINE를 사용할 수있는 것은 그래서 g_pi 당신이 그것을 포함하는 모든 번역 단위로 통근 할 것이다 globals.cpp를 제외하고

+0

오, 방금이 문제가 귀하의 문제가 아닌 것을 보았습니다 :-) – Smittii

2

연결 순서가 문제 일 수 있습니다. 전역 개체 파일을 마지막 개체로 연결하십시오.

+1

문제가되지 않습니다. 링커는 모든 순서를 처리해야합니다. C++은 전역을 양방향으로 사용할 수 있기 때문입니다. 예 : A.cpp는'int a'를 정의하고'b'를 사용하는 반면, B.cpp는'a'를 사용하여'int b'를 정의합니다.이 링크가 연결되어야하며 링크 순서에서 하나의 파일이 다른 파일보다 우선해야합니다. – MSalters

6

#include globals.h 대신 #include gobals.h가 있다고 생각합니다. 이것은 globals.h를 삽입하지 않기 때문에 정의되지 않은 참조를 제공합니다. C++ 프리 D 파일러는 헤더 파일을 찾을 수 없으면 실패하지 않습니다. 대신 컴파일시 정의되지 않은 참조 메시지가 나타납니다.