关于C++中extern的简单笔记
extern可以实现多文件共享同一个变量、const常量、函数。
下面结合几个例子来讲一下extern的相关性质(下述皆为多文件编译):
例1:
//file1.cpp
#include<iostream>
using namespace std;
extern int count;
int main(){
cout<<count<<endl;
return 0;
}
//file2.cpp
int count=3;
...
将两个文件一起编译,则输出会是3,因为file1使用了在file2中定义的全局变量count,全局变量也叫外部变量,具有外部链接性,意思就是可以被外部文件引用。
注意,当使用extern声明变量时,要求被声明的变量只能在一个文件中被定义,比如再有个file3里面也定义了一个名为count的全局变量,然后跟file1、file2一起编译,那编译器就会报错,因为不知道要引用哪个count,这也被称为单独定义规则。
总而言之,在多文件程序中,可以在一个文件(且只能在一个文件)中定义一个外部变量。使用该变量的其他文件必须使用extern来声明他。(摘自C++ Primer Plus)
例2:
//file1.cpp
#include<iostream>
using namespace std;
void f(int x){
if(x>3) return;
extern int count;
count++;
cout<<count<<endl;
f(x+1);
}
int main(){
f(1);
return 0;
}
//file2.cpp
int count=1;
...
上述例子中,file1和file2一起编译,运行后的输出是:
2
3
4
因为file1使用extern声明的count实际上就是file2中的count(同一个存储地址),file1只是声明要引用file2中的count,而不是重新定义一个count,所以即使递归调用函数也不会影响count保留上一次的值。这一点跟用static定义一个内部变量很像,不同的是static定义的内部变量只能初始化一次,而extern声明的变量不能初始化。
例3:
//file1.cpp
#include<iostream>
using namespace std;
extern const int x;
int main(){
cout<<x<<endl;
return 0;
}
//file2.cpp
extern const int x=5;
...
上述例子中,file1和file2一起编译,运行后的输出是5。显然file1通过extern声明引用了在file2中的const常量x。
但是为什么file1和file2都要加extern? 要如何实现多个文件共享一个const常量呢?
因为const声明的常量它的链接性是内部的,默认是不能被其他文件用extern引用的。也就是说例1中说的单定义规则对它并不适用,所以即使在多个文件中定义同名的const常量,也不会有问题。
可以使用extern来覆盖其默认的内部链接性,就像file2中做得那样,并且只能在一个文件中被初始化。
```c++
例4:
include
using namespace std;
extern void f(int x);
int main(){
f(2);
return 0;
}
include
using namespace std;
void f(int x){
cout<<x<<endl;
}
...
上述例子的输出为2,file1中利用extern引用了file2中的extern。函数的链接性和常规变量类似,故例1中讲的性质对函数都适用,不再赘述。
若想函数只在文件内部可见,可使用static关键字将函数的链接性设置为内部的。
关于C++中extern的简单笔记的更多相关文章
- Unity3d中SendMessage 用法简单笔记
Message相关有3条指令:SendMessage ("函数名",参数,SendMessageOptions) //GameObject自身的ScriptBroadcastMes ...
- 【转载】C/C++中extern关键字详解
1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定. 也就是说extern ...
- C/C++中extern关键字解析
1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定. 也就是说extern ...
- C/C++中extern关键字详解
转自:http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html 1 基本解释:extern可以置于变量或者函数前,以标示变 ...
- Android_简单笔记一
入门学习Android的简单笔记(已经安装好了开发环境ADT) 一.关于 AndroidManifest.xml文件 1. android:icon和android:label定义了应用程序安装后显示 ...
- C++中extern(转)
1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定. 也就是说extern ...
- C++中extern “C”含义及extern、static关键字浅析
https://blog.csdn.net/bzhxuexi/article/details/31782445 1.引言 C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C ...
- C/C++中extern关键字详解(转)
1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定. 也就是说extern ...
- ES6中Map数据结构学习笔记
很多东西就是要细细的品读然后做点读书笔记,心理才会踏实- Javascript对象本质上就是键值对的集合(Hash结构),但是键只能是字符串,这有一定的限制. 1234 var d = {}var e ...
随机推荐
- JqGrid参考实例
<div class="gridtable mt5"> <table id="tbList"></table> <di ...
- pands模块的妙用爬取网页中的表格
拿我这篇为例https://www.cnblogs.com/pythonywy/p/11574340.html import pandas as pd df = pd.read_html('https ...
- N-gram理解
如何来理解这个概率呢? p( i love you) 如果是 =p(i)p(love)p(you) 就是只考虑单词出现的概率本身. 如果是 =p(i)p(love|i)p(you|love) 就是 ...
- java.net.URLEncoder对中文的编码和解码
// java.net.URLEncoder对中文的编码和解码String str = URLEncoder.encode("测试字符串", "utf-8"); ...
- 工具sublime安装
默认安装后是英文版 view-show console 安装packagecontrol https://packagecontrol.io/installation ctrl+`打开控制台,输入代码 ...
- npm换源成淘宝镜像
由于node下载第三方依赖包是从国外服务器下载,虽然没有被墙,但是下载的速度是非常的缓慢且有可能会出现异常. 所以为了提高效率,我们还是把npm的镜像源替换成淘宝的镜像源.有几种方式供我们选择 使用c ...
- EXCHANGE上冒充任意用户--Exchange Server权限提升漏洞(CVE-2018-8581)分析
0x00 前言 这是我们2018年Top 5趣案系列中的第三个案例.这些漏洞都有一些因素使它们从今年发布的大约1,400个报告中脱颖而出.今天我们将分析一个Exchange漏洞,它允许任何经过身份验证 ...
- 安卓样式Style和主题Theme
1. 区别 不过style是针对view来说的,比如TextView和EditText这些:而Theme必须针对整个activity或者整个application 2. 样式 创建一个样式,根元素 & ...
- 后缀表达式 Java实现
基本原理: 从左到右扫描字符串:1.是操作数:压栈. 2.是操作符:出栈两个操作数,将运算结果压栈. 扫描字符串通过java.util.Scanner类实现,其next方法可以读取以空格(默认)或指定 ...
- 互斥锁的robust属性的介绍和使用
一个具体的场景:在多线程中,当一个线程获得锁之后异常退出后,应该怎么处理? 方案一 使用锁的robust特性 简单地讲,就是当拥有这个锁的线程挂了后,下一个尝试去获得锁的线程会得到EOWNWERDEA ...