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

c++ Global Variables Across Multiple Files

本文关键字:c++ 全局变量 文件      更新时间:2023-10-16

我有一些代码分布在三个文件中,我想使用第四个"gloabls"文件来存储一些物理常数,例如pi的值。这将避免CCD_ 1的重复定义。在摸索之后,我尝试创建一个全局头文件:

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

您可以简单地使用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

我认为问题是你有#include-gobals.h而不是#include-globals.h。这会给你未定义的引用,因为它没有插入global.h。C++预编译器在找不到头文件时不会失败。相反,在编译时会得到一条未定义的引用消息。

链接的顺序可能是个问题。尝试将全局对象文件链接为最后一个。

g_pi不能在一个翻译单元中声明为外部。你可以为这个使用一个小的#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;

所以g_pi在所有包含它的翻译单元中都是外部的,globals.cpp 除外

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