我使用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。
答案 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中的变量。