2

我使用 OpenGL 用 C++ 编写了一个简单的程序。我需要的是在两个文件(main.cppfuncs.cpp )中有几个全局变量,它们将保存相同的值。当我尝试在funcs.h(也包含在main.cpp中)中声明这些变量时,我收到了这个错误:

1>main.obj : error LNK2005: "int myVariable" (?myVariable@@3HA) already defined in funcs.obj
1>Path to my program : fatal error LNK1169: one or more multiply defined symbols found

这很明显,因为它会在 funcs.cpp 和 main.cpp 中创建变量。当我尝试以这种方式声明变量时:

//funcs.cpp
int myVariable;

//main.cpp
int myVariable;

而且它们都是全球性的,我得到的错误与上面完全相同。我感兴趣的是这两个变量在相反的文件中都不可见,那么为什么使用同名的变量是错误的呢?据我所知,没有可能myVariable从 main.cpp 引用 funcs.cpp 和反向。我的第二个问题是 - 解决我的问题的最佳方法是什么,因为我所做的只是重命名了其中一些变量(其中有很多)并在 funcs.cpp 中添加函数,就像setNewValue(int newValue)我可以从 main.cpp 调用一样但说实话 - 我并不为此感到自豪。

我使用 Microsoft Visual Studio 2012、C++/OpenGL。

4

3 回答 3

6

使用 C++:

  • 如果您尝试在两个文件之间共享全局变量,请在其中一个文件中声明它,例如main.c,就像您现在所做的那样,并在另一个文件中将变量声明为extern. 这样,变量已经在一个文件中声明,同一个变量可以在其他文件中使用,并且该变量的多个定义不会有问题。

  • 如果要在每个文件中使用同名的全局变量,以使文件不共享该变量,则使用匿名命名空间来限制变量的可见性:

    namespace
    {
        int myVariable;
    
        // ...
    

Standard C:为了完整起见,如果你使用的是标准 C,而不是使用命名空间来限制变量的可见性,你可以使用static关键字:如上,如果你想使用同名的全局变量在每个文件中,并且您希望文件共享该变量,那么您需要将它们声明为static. 这限制了它们对当前文件的可见性。

在 C 中共享全局 using 的extern工作方式类似。

于 2012-10-15T17:44:31.810 回答
2

默认情况下,全局范围内的变量可用于所有其他翻译单元;其他翻译单元只需要使用extern int myVariable来访问该全局变量。因此,通常,要创建一个对每个单元可见的全局变量,您将extern声明放在头文件中,并将变量声明本身放在一个.c/.cpp文件中。

如果要使变量只能在该文件中访问,请static在全局范围内声明它:

static int myVariable;
于 2012-10-15T17:44:20.360 回答
0

这是不合法的,因为某些假设的第三个文件可能会myVariable使用extern声明进行访问。那时,编译器将不知道该extern声明是指 funcs.cpp 中的变量还是 main.cpp 中的变量。

于 2012-10-15T17:44:48.910 回答