c++ - 全局变量和链接器错误

标签 c++

我使用 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 和反向引用 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,而不是使用 namespace 来限制变量的可见性,您可以使用 static 关键字:如上,如果你想在每个文件中使用同名的全局变量,并且你希望文件共享那个变量,那么您需要将它们声明为 static。这限制了他们对当前文件的可见性。

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

关于c++ - 全局变量和链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12901075/

相关文章:

c++ - 在 C++ 中使用 shell 命令

c++ - 整数到二进制存储在数组中

c++ - 这是否提供自动内存管理以及内存控制? shared_ptr<unique_ptr<数据>>?

python - 彭博 API Python 3.5.5 和 C++ 3.8.1.1。在 Mac OS X 上导入 blpapi 引用

c++ - C++除法精度不够如何提高结果精度

.net - Windows平台上不同类型的DLL

c++ - 成员函数的 pragma GCC 毒语法

c++ - 为什么在gtkmm中使用CellRenderer时TreeView中的信息显示两次

C++ 代码可以在 CentOS g++ 中编译,但不能在 Visual studio 2008 中编译

c++ - 如何从 C++ 程序获取 Linux 上的主板 ID