外部和链接器错误

时间:2013-08-14 23:54:21

标签: c++ linker namespaces extern

为什么需要在头文件中声明变量,然后在相应的cpp文件中再次声明变量:

一个。防止链接错误

    ex. header 1.h-
    namespace forglobal { 
    extern int x;
    }

     source 1.cpp- 
    namespace forglobal{
    int x=6;
    }

    source 2.cpp- 
    #include "1.h"
    cout<<x; //6

湾在不同的cpp文件中使用,我不能像我调用函数ex那样使用命名空间。

    header -1.h
    namespace forglobal {
    int x
    }

    source -1.cpp {
    namespace forglobal {
    void change() {
    x=5;
    }
    }
    }

    source -2.cpp 
    #include "1.h"
    forglobal::change();
    cout<<forglobal::x<<'\n'; //5

3 个答案:

答案 0 :(得分:1)

任何未声明为extern的命名空间级变量声明也是一个定义。也就是说,如果您的标题包含非extern变量声明,该声明包含在链接到程序中的多个翻译单元中,您将获得多个定义。为防止这种情况,请将标头中的变量声明标记为extern,并省略定义所在的extern

当然,首先使用全局变量通常是一个坏主意,但这是一个不同的讨论。

答案 1 :(得分:1)

这个问题与C ++中的一个基本概念有关,即一个定义规则(ODR)。 正如DietmarKühl所说,没有“extern”,你对同一个变量有多个定义会违反ODR。

但是,在C ++中,您可以拥有尽可能多的声明。基本上声明在范围中引入了名称,定义为变量分配了一些内存。

请参阅Bjarne Stroutstrup的书,“C ++编程语言”。

答案 2 :(得分:0)

在第二种情况下,您在两个位置为变量x分配空间,因此链接器不知道如何访问变量。在前者中,只分配了一个地方,因此没有混淆。