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关键字理解的更多相关文章

  1. C++(extern关键字的理解和作用深入)

    extern关键字的理解和作用深入 extern是一个关键字,它告诉编译器存在着一个变量或者一个函数,如果在当前编译语句的前面中没有找到相应的变量或者函数, 也会在当前文件的后面或者其它文件中定义 引 ...

  2. 15-static和extern关键字1-对函数的作用

    一.extern与函数 如果一个程序中有多个源文件(.c),编译成功会生成对应的多个目标文件(.obj),这些目标文件还不能单独运行,因为这些目标文件之间可能会有关联,比如a.obj可能会调用c.ob ...

  3. 关于全局变量和函数,在其他类中调用问题,extern关键字

    1个工程下有几个类文件,和1个全局的文件comm.h, comm.h中存放了这几个类同时需要的变量和同时调用的函数. 当时,我只在comm.h中定义: int  commData1: vector&l ...

  4. 用extern关键字使程序更加清晰

    一.基础研究 之前基于tcc.tlink实现一个新的编译连接工具cc.exe,用到的文件有cs.lib.c0s.obj.main.obj,其中main.obj是我们自己加入的文件,它可以实现开始显示彩 ...

  5. static和extern关键字 对函数的作用

    本文目录 • 一.extern与函数 • 二.static与函数 • 三.static.extern与函数的总结说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能 ...

  6. 【C语言】19-static和extern关键字1-对函数的作用

    一.extern与函数 在前面我提到过一句话:如果一个程序中有多个源文件(.c),编译成功会生成对应的多个目标文件(.obj),这些目标文件还不能单独运行,因为这些目标文件之间可能会有关联,比如a.o ...

  7. C++之extern关键字

    extern关键字 extern extern关键字的作用就是告诉编译器,它修饰的变量或者函数在别处定义. extern "C" 代码一: cppExample.h #ifndef ...

  8. (转)extern关键字两种场景的使用

    第一种场景 -- extern extern关键字的作用是声明变量和函数为外部链接,即该变量或函数名在其它文件中可见.用其声明的变量或函数应该在别的文件或同一文件的其它地方定义. 例如语句:exter ...

  9. C++之宏、extern关键字与多线程

    理解C++ 宏 1.特殊字符 考虑下面的需求,程序中多处使用文本字符串.我们知道文本字符串前后都要加上双引号,我很讨厌输入双引号.有没有好的办法呢?根据常识,使用下面的宏: #define Str(x ...

随机推荐

  1. vue的computed属性的理解

    computed: { selectedQuestions() { let selectedQuestions = this.editedItem.questions; return this.que ...

  2. Java拷贝——深拷贝与浅拷贝

    深拷贝和浅拷贝 值类型 vs 引用类型 在Java中,像数组.类Class.枚举Enum.Integer包装类等等,就是典型的引用类型,所以操作时一般来说采用的也是引用传递的方式: 但是Java的语言 ...

  3. shader变体

    unity shader 变种(多重编译 multi_compile) https://www.jianshu.com/p/f34d896dde5d Unity Shader - Making mul ...

  4. CodeForces - 1114D-Flood Fill (区间dp)

    You are given a line of nn colored squares in a row, numbered from 11 to nn from left to right. The  ...

  5. 【问题】【SpringBoot】记一次springboot框架下用jackson解析RequestBody失败的问题

    最近项目中遇到了一个问题,费好大劲才发现问题所在,并且修复了问题,下面分享一下这个问题的定位和修复的新路旅程. 先说下背景:该项目用的是SpringBoot框架,主要功能为对外提供一些Restful ...

  6. php中的加密解密模块-mcrypt

    <?php /* 打开加密算法和模式 */ $td = mcrypt_module_open('rijndael-256', '', 'ofb', ''); /* 创建初始向量,并且检测密钥长度 ...

  7. Oracle序列Sequence用法

    序列 序列(Sequence)是用来生成连续的整数数据的对象.序列常常用来作为主键中增长列,序列中的可以升序生成,也可以降序生成.创建序列的语法是:语法结构:创建序列 CREATE SEQUENCE ...

  8. 我是怎样通过个人项目成长为高级 JavaScript 开发者的

    大道理都是能用三两句话说清的 . 在我开发人员的职业生涯中,最好的决定之一就是不再满足于只做工具的使用者. 我决定创建我自己的工具,并不是为了卖钱,而是要了解这些技术的实际工作方式,并提升我的技术技能 ...

  9. Conscription(POJ 3723)

    原题如下: Conscription Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16584   Accepted: 57 ...

  10. mysql数据库常见问题修改(待补充)

    1.修改mysql最大连接数的方法:临时修改:1.使用命令show variables 来查看当前最大连接数 show variables like '%max_connections%'; 使用命令 ...