关于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 ...
随机推荐
- YAML语言简明教程
编程免不了要写配置文件,如果你还在用xml/ini/json,就有点过时了,怎么写配置也是一门学问. YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便. 本文介绍 YAM ...
- 一.Linux
1.常用命令 Linux 命令的语法格式命令[选项][参数] Ctrl + l #清屏 clear #清屏 Ctrl +c #结束命令 man su #查看su 帮助信息,q 退出 su --help ...
- java。JDK的API,版本1.6.0中文版下载
转载自https://blog.csdn.net/xiao9469/article/details/87783561 链接: https://pan.baidu.com/s/1YqrbTD_msTmn ...
- CSS 基础样式
文本 p{ font-family:Cambria, "Hoefler Text", "Liberation Serif", Times, "Time ...
- expdp、impdp导入导出数据库
一.创建逻辑目录,该命令不会在操作系统创建真正的目录,最好以system等管理员创建.create directory dpdata1 as 'd:\test\dump'; 二.查看管理理员目录(同时 ...
- UML类图 入门 (转载)
学习 UML的类图,主要是为了学习设计模式方便,也便于自己看别人代码时,用UML来整理别人的设计.所以基本的学习工具还是必须掌握. 参考: https://blog.csdn.net/qq_35495 ...
- Django之DRF源码分析(四)---频率认证组件
核心源码 def check_throttles(self, request): """ Check if request should be throttled. Ra ...
- SaltStack--配置管理
saltstack配置管理 Saltstack状态模块 远程执行模块的执行是过程式,而状态是对minion的一种描述和定义,管理人员不需要关系部署任务如何完成的,只需要描述minion的状态描述.它的 ...
- 纯数据结构Java实现(9/11)(AVL)
欢迎访问我的自建博客: CH-YK Blog.
- 如何监控网站URL是否正常?
监控网站URL是否正常最常见的方法莫过于wget和curl命令了,这两个命令都是非常强大的,强大到网友查看帮助都无从选择的地步了,今天呢,老男孩老师正好录制Shell编程实战课程,因此,顺便总结了一下 ...