} } }

    浅谈C++ extern声明

    添加时间:2013-8-5 点击量:

    初出茅庐,正在进修C++的路上,只是这条路还一向在施工,呵呵。这几天回头复习下根蒂根基常识,对extern在《C++ primer》书中的定义懂得不是很透辟,又和伴侣商量了一下,于是我们筹算实践一下来帮助懂得。下面我就来说说实践中的感触感染吧~


    引用《C++ primer》书中对extern的申明:



    extern声明不是定义,也不分派空间。事实上,它只是申明变量定义在法度的其他处所。法度中变量可以声明多次,但只能定义一次。


    任安在多个文件中应用的变量都须要有与定义分别的声明。在这种景象下,一个文件含有变量的定义,应用该变量的其他文件则包含该变量的声明(而不是定义)。



    看到这里,我不禁有几个困惑:



    1. extern声明时能不克不及定义变量?

    2. extern是跨文件的吗?不须要引用头文件?

    3. 若是多个头文件中都定义了同名变量会呈现什么景象?

    4. 声明的同时定义一个雷同的局部变量,会产生重名吗?


    下面我进行了一翻实践,起建a.h头文件,代码如下:


    int a = 1;

    接着,创建main.cpp文件,代码如下:


    #include <iostream>
    
    using namespace std;

    int main()
    {
    extern int a;
    cout<<a<<endl;
    system(pause);//用于暂停窗口以看清输出成果
    return 0;
    }

    输出的成果是1,申明extern声明时是可以定义变量的,同时也解答了第二个题目,extern是跨文件的,不须要引用a.h头文件。


    接下来,我们创建b.h头文件,同样定义一个雷同变量a。代码如下:


    int a = 2;

    成果编译器提示报错,报错内容为:



    1>main.obj : error LNK2001: 无法解析的外部符号 int a (?a@@3HA)
    1>E:\Program\c++\操练\cpptest\Debug\cpptest.exe : fatal error LNK1120: 1 个无法解析的外部号令





    获得一个这么奇葩的报错提示,我小我认为原因应当是编译器不知道引用哪一个变量a,我们必须指引法度去引用一个变量a。


    解决办法可以经由过程引用须要的那个头文件。


    最后,我们在int main()函数中定义一个a变量,其他代码不变。代码如下:


    #include <iostream>
    
    using namespace std;

    int main()
    {
    extern int a;
    int a = 2;
    cout<<a<<endl;
    system(pause);//用于暂停窗口以看清输出成果
    return 0;
    }

    成果是编译器提示报错,报错内容为:“int a”: 重定义。


    其实extern的感化就是在此处引用了头文件中的定义,使其可以或许引用其他文件中的全局变量a,相当于把全局变量变成了函数中可用的局部变量。若是将“extern int a;”这行代码删除,那么输出成果则为2。


    总结:经过本身的实践,我终于熟悉打听了extern引用是怎么一回事,也熟悉打听了primer上它只是申明变量定义在法度的其他处所的意思,这些教材上很多翻译过来的话都很是专业,让初学者很难懂得真正的目标,最后呢,请各类大神,高手手下留情。如有错误或者定见,迎接私信或者评论。

    容易发怒的意思就是: 别人做了蠢事, 然后我们代替他们, 表现出笨蛋的样子。—— 蔡康永
    分享到: