全局变量和链接器错误

时间:2012-10-15 17:42:00

标签: c++

我使用OpenGL在C ++中编写了一个简单的程序。我需要的是在两个文件中有两个全局变量 - main.cpp funcs.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;

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

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

3 个答案:

答案 0 :(得分:6)

使用C ++:

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

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

    namespace
    {
        int myVariable;
    
        // ...
    

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

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

答案 1 :(得分:2)

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

如果您想仅在该文件中访问变量,请在全局范围内声明static

static int myVariable;

答案 2 :(得分:0)

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