如何在C++中拥有全局变量
How to have a global variable in C++
我正在重写某人的代码,他有一个全局变量,当Java回调到C时,该变量在初始化过程中很有用。看起来他们已经在几个地方用extern
前缀声明了这个变量,有一次没有。我真的不明白为什么他们会对全局变量(前缀为g_
)这样做,而我宁愿称它为static
并只声明一次。
我能做到这一点吗?或者static
在这种情况下对线程安全有负面影响吗?我的大部分代码是C++,但也有一些extern 'C'
的东西,比如Java调用的那些函数。
目前我没有使用extern
或static
,但我倾向于相信这就是我出现链接错误的原因。
static
不会防止在编译多个编译单元期间重复变量。当您链接这些编译单元时,它们最终会看到同一变量的不同"实例"。换句话说,每个人都会看到自己的副本。
extern
的作用正是为了避免这种重复。您在实现文件(.c
)中声明全局(非static
)变量,并在给定的头文件(.h
)上将其声明为extern
,以便由依赖它的每个源文件包含
您可以在C++中拥有全局变量,就像在C中一样。全局变量构成共享状态,所以就像在C或任何语言中一样,如果您同时从多个线程访问共享状态(至少有一个可变访问),则必须提供同步。
extern "C"
链接规范只有在您希望访问以不同语言编译的多个翻译单元中的同一变量时才是必要的,这些语言都使用C链接规则。
(与C不同,C++全局变量可以进行非平凡的初始化,这会带来一些新的排序问题。但这并不重要。)
混合extern
、extern "C"
和static
当在全局作用域中声明一个正则变量或函数时,编译器将其公开为"公共符号"
当您在指定的变量声明之前使用extern
时,它是在其他文件中声明的公共符号。如果你不使用extern
,你会得到链接错误,说变量已经定义。
声明之前的static
关键字做了完全相反的事情:它防止符号是公共的,因此,它只知道它被声明(或包含)在哪里,而不能被extern
编辑。这就是为什么当你两次声明同一个静态变量时,你不会得到"已定义"的链接错误,而且它实际上会被声明两次。
最后CCD_ 22使得变量在C约定中而不是在C++约定中发布。主要区别在于所谓的"过载"。在C++中,几个函数可以具有相同的名称,具有不同的参数类型,因此需要一个约定来将类型保留在函数名称中。在C中,原样名称是公共符号名称。当您不想让C++函数在C或任何其他语言中可用,甚至可能在其他C++编译器版本中可用时,您应该使用它。
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 当vector是tje全局变量时,c++中vector的内存管理
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 内联函数中具有内部链接的全局变量
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 全局变量 多读取器 一个写入器多线程安全?
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 不同作用域中的静态变量和全局变量
- C++ 在编译时具有函数计算全局变量
- 修改程序的入口点时未调用全局变量的构造函数
- 使用 std::ios_base::Init 正确初始化全局变量
- 为什么我的全局变量似乎没有变化?
- C ++程序如何返回我的数组或写入全局变量
- 为什么我的数组值与此处的全局变量不匹配?
- QT C++中对全局变量的未定义引用
- 跨多个类的全局变量而不会出现重定义错误?
- 赋予全局变量而不是局部变量优先级的函数 - (异常行为)
- C++线程不检测全局变量更改
- 在 elf 文件中查找全局变量的位置
- 如何在C++中拥有全局变量