浅谈C++ extern声明
添加时间:2013-8-5 点击量:
初出茅庐,正在进修C++的路上,只是这条路还一向在施工,呵呵。这几天回头复习下根蒂根基常识,对extern在《C++ primer》书中的定义懂得不是很透辟,又和伴侣商量了一下,于是我们筹算实践一下来帮助懂得。下面我就来说说实践中的感触感染吧~
引用《C++ primer》书中对extern的申明:
extern声明不是定义,也不分派空间。事实上,它只是申明变量定义在法度的其他处所。法度中变量可以声明多次,但只能定义一次。
任安在多个文件中应用的变量都须要有与定义分别的声明。在这种景象下,一个文件含有变量的定义,应用该变量的其他文件则包含该变量的声明(而不是定义)。
看到这里,我不禁有几个困惑:
- extern声明时能不克不及定义变量?
- extern是跨文件的吗?不须要引用头文件?
- 若是多个头文件中都定义了同名变量会呈现什么景象?
- 声明的同时定义一个雷同的局部变量,会产生重名吗?
下面我进行了一翻实践,起建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上它只是申明变量定义在法度的其他处所的意思,这些教材上很多翻译过来的话都很是专业,让初学者很难懂得真正的目标,最后呢,请各类大神,高手手下留情。如有错误或者定见,迎接私信或者评论。
容易发怒的意思就是: 别人做了蠢事, 然后我们代替他们, 表现出笨蛋的样子。—— 蔡康永
初出茅庐,正在进修C++的路上,只是这条路还一向在施工,呵呵。这几天回头复习下根蒂根基常识,对extern在《C++ primer》书中的定义懂得不是很透辟,又和伴侣商量了一下,于是我们筹算实践一下来帮助懂得。下面我就来说说实践中的感触感染吧~
引用《C++ primer》书中对extern的申明:
extern声明不是定义,也不分派空间。事实上,它只是申明变量定义在法度的其他处所。法度中变量可以声明多次,但只能定义一次。
任安在多个文件中应用的变量都须要有与定义分别的声明。在这种景象下,一个文件含有变量的定义,应用该变量的其他文件则包含该变量的声明(而不是定义)。
看到这里,我不禁有几个困惑:
- extern声明时能不克不及定义变量?
- extern是跨文件的吗?不须要引用头文件?
- 若是多个头文件中都定义了同名变量会呈现什么景象?
- 声明的同时定义一个雷同的局部变量,会产生重名吗?
下面我进行了一翻实践,起建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上它只是申明变量定义在法度的其他处所的意思,这些教材上很多翻译过来的话都很是专业,让初学者很难懂得真正的目标,最后呢,请各类大神,高手手下留情。如有错误或者定见,迎接私信或者评论。
容易发怒的意思就是: 别人做了蠢事, 然后我们代替他们, 表现出笨蛋的样子。—— 蔡康永