Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 链接器在头文件中为全局变量提供错误的原因_C++_Linker_Extern - Fatal编程技术网

C++ 链接器在头文件中为全局变量提供错误的原因

C++ 链接器在头文件中为全局变量提供错误的原因,c++,linker,extern,C++,Linker,Extern,我在header.h中声明了一个全局变量,并在source.cpp和main.cpp中包含了该header,但链接器给出了错误消息 Source.obj : error LNK2005: "int globalVariable" (?globalVariable@@3HA) already defined in Main.obj GlobalVariableAndLinkageIssue.exe fatal error LNK1169: one or more multiply defi

我在header.h中声明了一个全局变量,并在source.cpp和main.cpp中包含了该header,但链接器给出了错误消息

Source.obj : error LNK2005: "int globalVariable" (?globalVariable@@3HA) already defined in     Main.obj
GlobalVariableAndLinkageIssue.exe fatal error LNK1169: one or more multiply defined symbols found
标题.h source.cpp main.cpp
要创建全局变量,应执行以下操作。注意,在标题中,我们将变量标记为
extern
,实际上我们在
cpp
文件中创建了对象

标题.h header.cpp main.cpp 因为两个源都包含您的标题,因此它被定义了两次

  • 将声明移动到.cpp文件。您可以使用以下命令在头文件中使用声明:

    extern int globalVariable;//标题中的声明-可以有您需要的数量

    但.cpp文件应具有以下定义:

    int globalVariable;//.cpp中的定义-在所有文件中只需要一个定义

    C和C++使用文本预处理器来包括标题,这基本上是文本插入,而不是一些语言中的智能模块系统。通过按原样包含它,可以创建多个定义,每个.cpp文件一个定义

  • 作为一种良好的实践,您需要习惯于使用include防护来保护多个嵌套include(尽管它不能解决您当前的问题)。如果使用Visual C++,可以使用<代码>·*语用>曾经/<代码>,或者使用一个便携式解决方案将您的头代码包在:

    \ifndef\u包括\u FOO\u H\u

    #endif


  • 在这种情况下,通常使用一些#定义如下:

    //header.h
    #ifdef DEFINE_VARS
       #define DEFINE_OR_DECLARE 
    #else
       #define DEFINE_OR_DECLARE extern
    #endif
    
    DEFINE_OR_DECLARE int globalVariable;
    
    
    //main.cpp
    #define DEFINE_VARS
    #include "header.h"
    ...
    
    //header.cpp
    #include "header.h"
    ...
    

    将全局变量放在某个.c或.cpp文件中,这样它只能定义一次,并使用extern在头文件中引用 比如说,

    标题.h

    extern int globalVariable;
    
    标题.cpp

    int globalVariable = 0;
    
    #include "header.h"
    
    #include"header.h"
    
    int main() {
      return 0;
    }
    
    source.cpp

    int globalVariable = 0;
    
    #include "header.h"
    
    #include"header.h"
    
    int main() {
      return 0;
    }
    
    main.cpp

    int globalVariable = 0;
    
    #include "header.h"
    
    #include"header.h"
    
    int main() {
      return 0;
    }
    

    可能重复的我永远不会推荐这个。你能解释一下为什么吗?假设我想要
    globalVariable
    的默认值为4。所以我定义或声明int-globalVariable=4。这将导致出现如下警告:
    a.c:1:warning:“x”已初始化并声明为“extern”
    。但您永远不会在这种情况下指定分配。这种技术在确保头文件不会错过新引入的var[s]方面非常有效。然后在定义源中使用初始化例程,以避免您描述的默认值场景。