1

为什么变量需要在头文件中声明时externed,然后在相应的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
4

3 回答 3

1

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

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

请参阅 Bjarne Stroutstrup 所著的《C++ 编程语言》一书。

于 2013-08-15T00:31:32.353 回答
1

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

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

于 2013-08-14T23:57:52.210 回答
0

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

于 2013-08-14T23:57:44.607 回答