2012-03-14 121 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++预编译器在找不到头文件时不会失败。相反,您在编译时会收到未定义的参考消息。