【问题标题】:c++ Global Variables Across Multiple Filesc++ 跨多个文件的全局变量
【发布时间】:2019-05-30 23:23:42
【问题描述】:

我有一些代码分布在三个文件中,我想使用第四个“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++ 编译器。希望它是一个简单的修复!非常感谢您的建议。如果需要更多详细信息,我很乐意提供。

【问题讨论】:

  • 问题可能在于您构建可执行文件的方式,因此您应该将用于执行此操作的任何内容添加到您的问题中(Makefile、g++ 命令行...)。
  • 你能包括你执行编译的确切命令吗?以及确切的错误信息?

标签: c++ header global-variables


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 不可能是问题。链接器必须处理任何顺序,因为 C++ 允许双向使用全局变量。例如。 A.cpp 定义int a 并使用b,而B.cpp 使用a 并定义int b。这必须链接,显然一个文件必须在链接顺序中位于另一个文件之前。
      【解决方案4】:

      g_pi 不得在一个翻译单元中声明为 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;
      

      所以 g_pi 将在您包含它的所有翻译单元中为外部,除了 globals.cpp

      【讨论】:

      • 哦,我刚看到这不是你的问题 :-)
      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-25
        • 2013-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多