跨多个文件的c++全局变量
c++ Global Variables Across Multiple Files
我有一些代码分布在三个文件中,我想使用第四个"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可执行文件中。这个问题应该是类似的,实现本身没有问题。
相关文章:
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 当vector是tje全局变量时,c++中vector的内存管理
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 内联函数中具有内部链接的全局变量
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 全局变量 多读取器 一个写入器多线程安全?
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 不同作用域中的静态变量和全局变量
- C++ 在编译时具有函数计算全局变量
- 修改程序的入口点时未调用全局变量的构造函数
- 使用 std::ios_base::Init 正确初始化全局变量
- 为什么我的全局变量似乎没有变化?
- C ++程序如何返回我的数组或写入全局变量
- 为什么我的数组值与此处的全局变量不匹配?
- QT C++中对全局变量的未定义引用
- 跨多个类的全局变量而不会出现重定义错误?
- 赋予全局变量而不是局部变量优先级的函数 - (异常行为)
- C++线程不检测全局变量更改
- 在 elf 文件中查找全局变量的位置
- 包括一个类来定义全局变量参数 c++ :(