c ++跨多个文件的全局变量

时间:2012-03-14 19:48:06

标签: c++ header global-variables

我有一些代码分布在三个文件中,我想使用第四个“gloabls”文件来存储一些物理常量,例如pi的值。这样可以避免重复定义pi = 4*atan(1.0)。在探索之后,我尝试过创建一个全局头文件:

/*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 ++编译器。希望它是一个简单的修复!非常感谢您的建议。如果需要更多细节,我很乐意提供。

5 个答案:

答案 0 :(得分:14)

你可以简单地使用include中的M_PI(还有其他常量)。

编辑:您的设置正确无误。我得到了一个有效的例子:

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 :(得分:6)

我认为问题是你有#include gobals.h而不是#include globals.h。这将为您提供未定义的引用,因为它不插入globals.h。当C ++预编译器找不到头文件时,它不会失败。相反,您在编译时会收到未定义的引用消息。

答案 2 :(得分:2)

链接的顺序可能是问题所在。尝试将全局目标文件链接为最后一个。

答案 3 :(得分:1)

g_pi musst不能在一个翻译单元中声明为extern。 你可以使用一个小的#define来实现这个

globals.cpp中的

#define MY_EXTERN_CPP
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

之外,g_pi将包含在你包含它的所有翻译单元中

答案 4 :(得分:0)

我有同样的问题。我正在使用CMAKE,问题是我没有将globals.cpp文件放入CMAKE可执行文件中。这个问题应该是类似的东西,实现本身没有错。