我用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
Run Code Online (Sandbox Code Playgroud)
这很明显,因为它会在funcs.cpp和main.cpp中创建变量.当我尝试以这种方式声明变量时:
//funcs.cpp
int myVariable;
//main.cpp
int myVariable;
Run Code Online (Sandbox Code Playgroud)
而且它们都是全局的我得到与上面完全相同的错误.我感兴趣的是两个变量在相反的文件中都不可见,那么为什么有相同名称的变量是错误的呢?据我所知,没有可能myVariable从main.cpp 引用funcs.cpp并反向.我的第二个问题是 - 解决我的问题的最佳方法是什么,因为我所做的只是重命名了一些变量(有很多变量)并在funcs.cpp中添加函数setNewValue(int newValue),我可以从main.cpp中调用它们但说实话 - 我并不为此感到骄傲.
我使用Microsoft Visual Studio 2012,C++/OpenGL.
使用C++:
如果你试图在两个文件之间共享全局变量,那么就像在你现在做的那样在其中一个文件中声明它,例如main.c,在另一个文件中将变量声明为extern.这样,变量已在一个文件中声明,并且同一个变量可以在其他文件中使用,并且您不会遇到该变量的多个定义的问题.
如果要在每个文件中使用具有相同名称的全局变量,以使文件不共享该变量,则使用匿名命名空间来限制变量的可见性:
namespace
{
int myVariable;
// ...
Run Code Online (Sandbox Code Playgroud)标准C:为了完整起见,如果您使用的是标准C,而不是使用命名空间来限制变量的可见性,您可以使用static关键字:如上所述,如果您想使用具有相同名称的全局变量在每个文件中,并且您不希望文件共享该变量,那么您需要将它们声明为static.这限制了它们对当前文件的可见性.
extern在C中共享全局使用的工作方式类似