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. 理解Word2Vec

    一.简介 Word2vec 是 Word Embedding 的方法之一,属于NLP 领域.它是将词转化为「可计算」「结构化」的向量的过程.它是 2013 年由谷歌的 Mikolov 提出了一套新的词 ...

  2. 构造清华大学的yum源

    [root@localhost ~]# cd /etc/yum.repos.d/ [root@localhost yum.repos.d]# vim qinghua.repo [qinghua] na ...

  3. webdriver入门之环境准备

    1.安装ruby 下载ruby的安装包,很简单,不解释.装好之后打开cmd输入以下命令验证是否安装成功 ruby -v 2.安装webdriver 确保机器联网,用gem命令安装是在有网络的情况下进行 ...

  4. slua中,绑定lua文件到Monobehavior的一种方法

    slua本身并不提供如何把一个lua文件绑定到一个预制中,就像一个普通的继承自monobehavior的自定义脚本那样,而tolua的框架却采用了拙劣的做法: public class LuaBeha ...

  5. 发布jar包到服务器读取resource目录下文件

    * 解决:当项目打包成jar之后resources路径下面的证书文件访问不到* 思路:* 1.运行时先复制一个jar* 2.将复制的jar解压到jar文件目录* 3.删除复制的jar跟解压的非证书文件 ...

  6. leetcode刷题-74搜索二维矩阵

    题目 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列.每行的第一个整数大于前一行的最后一个整数.示例 1: 输入:matrix ...

  7. 反射之hasattr() getattr() setattr() 函数

    Python的hasattr() getattr() setattr() 函数使用方法详解 hasattr(object, name)判断object中有没有一个name字符串对应的方法或属性,返回B ...

  8. 【好消息】博客迁移到github,求关注,求star,求支持

    博客迁移到github 地址:https://github.com/dirkhe1051931999/hjBlog

  9. php第七天-文件处理系统

    0x01 文件系统概述 1.1文件类型 在程序运行时,程序本身和数据一般都存在内存中,当程序运行结束后,存放在内存中的数据被释放. 如果需要长期保存程序运行所需的原始数据,或程序运行产生的结果,就必须 ...

  10. Java多线程--创建和使用线程池

    使用线程池的目的 线程是稀缺资源,不能频繁的创建 解耦作用:线程的创建与执行完全分开,方便维护 将其放入一个池子中,可以给其他任务进行复用 优点 降低资源消耗,通过重复利用已创建的线程来降低线程创建和 ...