C++extern关键字理解
extern是一种“外部声明”的关键字,字面意思就是在此处声明某种变量或函数,在外部定义。
下面的示意图是我的理解。
extern关键字的主要作用是扩大变量/函数的作用域,使得其它源文件和头文件可以复用同样的变量/函数,也起到类似“分块储存”的作用,划分代码。如图所示,在一个头文件里做了外部声明,就能把变量的定义部分和函数体的实现部分转移到其它地方了。

extern声明的格式如下,只是在变量声明时前面加上个”extern“:
extern int a;
extern double b;
extern const struct box *box_ptr
extern double box_volume(box box_ptr)
下面是个例子,程序提示用户输入一个盒子的长宽高,存储在结构体内,然后用函数输出该盒子的体积,再用一个函数将盒子的三维长度扩大一倍,最后再次输出它的体积。
主函数:
//main.cpp #include<iostream>
#include"box_manu.h" using namespace std; int main()
{
make_box(); //引导用户输入一个新盒子的的信息 cout << "Volume of this box:" << box_volume(new_box) << endl; //输出该盒子的体积 bigger_box(); //把该盒子的三维加一倍 cout << "done.\n"; cout << "Bigger volume:" << box_volume(new_box) << endl; //输出改造后的体积 system("pause");
}
Extra.h里定义了box的结构体,做了相关变量和函数的外部声明。
//extra.h struct box
{
double length;
double width;
double height;
double volume; }; extern const struct box * box_ptr; extern box new_box; extern double box_length;
extern double box_width;
extern double box_height; extern double box_volume(box box_ptr); extern void make_box();
box_make.cpp里定义了box结构类型的new_box变量,以及长宽高,但没赋值。给出了输出体积和提示输入的函数的原型。
//box_make.cpp #include<iostream>
#include"Extra.h"
using namespace std; box new_box; double box_volume(box box_ptr)
{
box_ptr.volume = box_ptr.height*box_ptr.length*box_ptr.width;
return box_ptr.volume;
} double box_length;
double box_width;
double box_height; void make_box()
{
cout << "Input length for the box:";
cin >> box_length;
new_box.length = box_length;
cout << "Input width for the box:";
cin >> box_width;
new_box.width = box_width;
cout << "Input height for the box:";
cin >> box_height;
new_box.height = box_height;
}
box_manu.h给出了扩大盒子三维的函数原型,并被main.cpp包括。
//box_manu.h #include<iostream>
#include"Extra.h"
void bigger_box()
{
new_box.length = 2 * new_box.length;
new_box.height = 2 * new_box.height;
new_box.width = 2 * new_box.width;
}
程序运行结果:
Input length for the box:2 [enter]
Input width for the box:2 [enter]
Input height for the box:2 [enter]
Volume of this box:8
done.
Bigger volume:64
值得注意的问题:
1.主函数include的box_manu.h已经include了Extra.h,如果再include一遍Extra.h。会报大量不兼容和重定义等错,应尽力避免重复引用头文件。
2.在extra.h里面声明的长宽高变量必须要在其它哪里给出定义,哪怕没有初值(例子中写到了box_make.cpp里面)。如果没有这么做,编译时会报LNK200“无法解析外部命令”的错。
3.多个头文件或源文件使用同一些变量,尝试把extern去掉后编译就会报“重定义”的错。
C++extern关键字理解的更多相关文章
- C++(extern关键字的理解和作用深入)
extern关键字的理解和作用深入 extern是一个关键字,它告诉编译器存在着一个变量或者一个函数,如果在当前编译语句的前面中没有找到相应的变量或者函数, 也会在当前文件的后面或者其它文件中定义 引 ...
- 15-static和extern关键字1-对函数的作用
一.extern与函数 如果一个程序中有多个源文件(.c),编译成功会生成对应的多个目标文件(.obj),这些目标文件还不能单独运行,因为这些目标文件之间可能会有关联,比如a.obj可能会调用c.ob ...
- 关于全局变量和函数,在其他类中调用问题,extern关键字
1个工程下有几个类文件,和1个全局的文件comm.h, comm.h中存放了这几个类同时需要的变量和同时调用的函数. 当时,我只在comm.h中定义: int commData1: vector&l ...
- 用extern关键字使程序更加清晰
一.基础研究 之前基于tcc.tlink实现一个新的编译连接工具cc.exe,用到的文件有cs.lib.c0s.obj.main.obj,其中main.obj是我们自己加入的文件,它可以实现开始显示彩 ...
- static和extern关键字 对函数的作用
本文目录 • 一.extern与函数 • 二.static与函数 • 三.static.extern与函数的总结说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能 ...
- 【C语言】19-static和extern关键字1-对函数的作用
一.extern与函数 在前面我提到过一句话:如果一个程序中有多个源文件(.c),编译成功会生成对应的多个目标文件(.obj),这些目标文件还不能单独运行,因为这些目标文件之间可能会有关联,比如a.o ...
- C++之extern关键字
extern关键字 extern extern关键字的作用就是告诉编译器,它修饰的变量或者函数在别处定义. extern "C" 代码一: cppExample.h #ifndef ...
- (转)extern关键字两种场景的使用
第一种场景 -- extern extern关键字的作用是声明变量和函数为外部链接,即该变量或函数名在其它文件中可见.用其声明的变量或函数应该在别的文件或同一文件的其它地方定义. 例如语句:exter ...
- C++之宏、extern关键字与多线程
理解C++ 宏 1.特殊字符 考虑下面的需求,程序中多处使用文本字符串.我们知道文本字符串前后都要加上双引号,我很讨厌输入双引号.有没有好的办法呢?根据常识,使用下面的宏: #define Str(x ...
随机推荐
- Pyinstaller打包: 将资源文件或文件夹打包到最后生成的exe中
前提:用pyinstaller打包时部分资源文件可以利用qrc转成py文件来读取,但是有部分文件类型不适用. 原理:Pyinstaller 将资源文件一起打包到exe中.当exe运行时,会生成一个临时 ...
- manualresetevent的用法学习
ManualResetEvent 允许线程通过发信号互相通信. 通常,此通信涉及一个线程在其他线程进行之前必须完成的任务. 当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用 Re ...
- cordova 环境配制和创建插件
环境配制 英文网站:http://cordova.apache.org/ 中文网站:http://cordova.axuer.com/ 安装Cordova Cordova的命令行运行在Node.js ...
- Go测试开发(一) 怎么写Go代码
安装过程略过,网上搜一大把. 介绍 本文会在一个module中开发一个简单的Go package. 同时介绍go tool(也就是go命令行). 以及如何fetch,build和install Go的 ...
- Activiti7 任务人员动态分配(理论)
之前一直用的流程模型都是,固态的,写死的 由于固定分配方式,任务只能一步一步执行,执行到每一个任务将按照bpmn的配置去分配任务负责人.这显然在实际开发中是不可能的 所以我们需要动态分配人员 表达式分 ...
- JS数组去重的实现
其实数组去重的实现就分为两大类 利用语法自身键不可重复性 利用循环(递归)和数组方法使用不同的api来处理. 注意️:下列封装成方法的要在函数开始增加类型检测,为了让去重的实现代码更加简单易懂,封装时 ...
- 用笛卡尔积来创建一千六百万大表 整体19分钟 大表建成两分钟 设置id13分钟
昨天拙文中讲述了用自增方式创建一千六百万大表的方案,这回讨论的是用笛卡儿积,实践证明这种方案更快. 2020年3月15日08点58分实验开始 创建仅有四千数据的tb_4thousand1表: SQL& ...
- 洛谷P1712 [NOI2016]区间 尺取法+线段树+离散化
洛谷P1712 [NOI2016]区间 noi2016第一题(大概是签到题吧,可我还是不会) 链接在这里 题面可以看链接: 先看题意 这么大的l,r,先来个离散化 很容易,我们可以想到一个结论 假设一 ...
- leetcode刷题-51N皇后
题目 n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 给定一个整数 n,返回所有不同的 n 皇后问题的解决方案. 每一种解法包含一个明确的 n 皇后问 ...
- 深入理解Java中的装箱与拆箱
一.Java数据类型 1.在说装箱与拆箱之前,先说一下Java的基本数据类型,Java从数据类型上可以划分为值类型与引用类型,值类型是四类八种,分别是: 整数型:byte̵,short̵,int̵,l ...