2012-03-14 120 views
9

我有一些代碼分佈在三個文件上,我想用第四個「gloabls」文件來存儲一些物理常量,例如pi的值。這將避免重複定義pi = 4*atan(1.0)跨多個文件的C++全局變量

/*globals.h*/ 
extern double g_pi; 

和全球CPP文件:

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

然後我包括在我的主文件,這些文件:

/*mainFile.cpp*/ 
//Include math and other libraries 
#include globals.h" 
int main() { 
/* 
.... 
*/ 
double x = 2*g_pi 
/* 
.... 
*/ 
} 
閒逛,我已經試過是建立一個全球性的頭文件之後

這給了我一個未定義的參考錯誤g_pi。我在Ubuntu上使用g ++編譯器。希望它是一個簡單的修復!你的建議非常感謝。如果需要更多細節,我會很樂意提供。

+0

問題可能在於您構建可執行文件的方式,因此您應該添加所使用的任何內容以對您的問題執行該操作(Makefile,g ++命令行...)。 – alexisdm 2012-03-14 19:51:44

+0

你能包括你執行編譯的確切命令嗎?確切的錯誤信息? – JaredC 2012-03-14 19:52:19

回答

12

您可以簡單地使用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; 
} 

的問題是你的編譯系統

wikipedia

1

g_pi musst在一個翻譯單元中不被聲明爲extern。 你可以在globals.cpp在/*globals.h

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

MY_CONFIGURATION_EXTERN double g_pi; 

用一個小的#define這個

#define MY_EXTERN_CPP 

所以g_pi會在你包括它所有的翻譯單位的extern globals.cpp除外

+0

哦,我剛剛看到這不是你的問題:-) – Smittii 2012-03-14 20:11:12

2

鏈接的順序可能是問題。嘗試鏈接全局對象文件作爲最後一個。

+1

不能成爲問題。鏈接器_must_處理任何順序,因爲C++允許雙向使用全局變量。例如。 A.cpp定義'int a'並使用'b',而B.cpp使用'a'並定義'int b'。這必須鏈接,並且顯然一個文件必須在鏈接順序中在另一個之前。 – MSalters 2012-03-15 10:53:21

6

我認爲問題是你有#include gobals.h而不是#include globals.h。這會給你未定義的引用,因爲它沒有插入globals.h。 C++預編譯器在找不到頭文件時不會失敗。相反,您在編譯時會收到未定義的參考消息。