全局变量和链接器错误

Global variables and linker error

本文关键字:错误 链接 全局变量      更新时间:2023-10-16

我用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;

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

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

使用C++:

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

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

    namespace
    {
    int myVariable;
    // ...
    

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

使用extern共享全局在C.中的作用类似

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

如果您想使一个变量只能在该文件中访问,请在全局范围内声明它为static

static int myVariable;

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

相关文章: