如何在C ++中使用全局变量

时间:2014-10-20 23:32:32

标签: java android c++ extern

我正在重写一个人的代码,他们有一个全局变量,在初始化时,当Java将其回调到C时,以及之后的回调。看起来他们已经在几个地方声明了这个变量,前缀为extern,一次没有。当我宁愿称之为g_并将其声明为一次时,我真的不明白为什么他们会对全局变量(前缀为static)执行此操作。

我能否做到这一点,或static在这种情况下对线程安全有负面含义吗?我的大部分代码都是C ++,但有一些extern 'C'的东西就像Java调用的函数一样。

目前我没有使用externstatic,但我倾向于相信这就是我收到错误的原因。

3 个答案:

答案 0 :(得分:4)

static不会阻止在编译多个编译单元期间复制变量。当您链接这些编译单元时,它们最终会看到同一变量的不同“实例”。换句话说,每个人都会看到自己的副本。

extern的用处正是为了避免这种重复。您在实现文件(static)中声明全局(非.c)变量,并在给定的头文件(extern)上将其声明为.h以包含在每个依赖它的源文件。

答案 1 :(得分:2)

你可以在C ++中拥有全局变量就像在C中一样。全局变量构成共享状态,就像在C中一样,或者在任何语言中,如果你同时从多个线程访问共享状态(至少一个可变访问),你必须提供同步。

仅当您要从使用C链接规则的不同语言编译的多个翻译单元访问同一变量时,才需要extern "C"链接规范。

(与C不同,C ++全局变量可以进行非平凡的初始化,这会带来一些新的排序问题。但这并不重要。)

答案 2 :(得分:2)

您混合externextern "C"static

在全局范围内声明常规变量或函数时,编译器将其公开为"公共符号"

在变量声明之前使用extern时,指定它是在其他文件中声明的公共符号。如果您不能使用extern,那么您将获得链接错误,表示已定义的变量。

声明之前的static关键字完全相反:它阻止符号公开,因此,它只知道声明(或包含)的位置,并且不能{{1 }}编。这就是为什么你没有得到已经定义的""当您声明两次相同的静态变量时,链接错误,它实际上将被声明两次。

最后,extern make变量已在C约定中发布,而不是在C ++约定中发布。主要区别在于称为"重载"。在C ++中,几个函数可以具有相同的名称,具有不同的参数类型,因此需要一个约定来保存函数名称中的类型。在C中,名称是公共符号名称。如果您不想使用C语言或任何其他语言,或者甚至是其他C ++编译器版本,可以使用它。