C语言中extern的用法

C语言中的Extern用法
网上有很多帖子问C语言中Extern的用法,而且回答的详细程度各尽不同. 所以我就像写一篇博文来谈谈我对extern的看法,不一定十分恰当,只当大家共勉.
在具体到Extern的用法之前,有两个概念必须要能分清楚:声明(Declaration)和定义(Definition)之间的区别. 声明一个变量只是宣布这个变量的属性,也就是说告诉编译器这个变量时什么类型(如int, long, string 等). 而定义一个变量不仅是声明了变量的属性,同时也告诉编译器给变量分配相应的存储空间. 例如:
//test.c
int value; //定义一个变量名为value,并分配相应存储空间
double arr[MAX_INTEGER];//定义数组变量名为arr,并分配相应的存储空间
extern int value1;//声明变量名为value1且这个变量在其他文件中定义的,没有分配存储空间
extern double arr1[MAX_INTEGER]//…同上
int main(){
….
}
理解了声明和定义的区别以后,我们开始进入今天的主题Extern的用法, 首先我们看看Extern修饰符的作用是什么? Extern作用其实很简单,就是允许你程序的一个模块调用另外一个模块里定义的全局变量或函数. 这话听起来有点拗口,简单点就是你在一个A.cpp文件里面定义了一个全局变量X,但是你B.cpp想引用这个X,这时用Extern修饰符就能办到了. 通常情况下你会把这个全局变量定义在头文件里.这样可能性更强些.
Extern 适用于变量和函数
下面我们就看个例子,这个例子记得有人写过,但是,我觉得他写的测试例子不太合适,所以就重写一下。
//Create a ext.h
Extern int value;
//create a ext.cpp
#include “stdio.h”
#include “ext.h”
Int value = 5;
Void printExt(){
Printf(“ext %d\n”, value);
}
//create test.cpp
#include “stdio.h”
#include “ext.h”
Extern void printExt();
int main(void){
value =3
printf(“\n test %d\n”,value);
printExt();
printf(“\n test %d\n”, value)
}
打印出来的结果,大家应该都能猜到是:
Test 3
Ext 3
Test 3


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292997.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

由逻辑异或运算符而发现的PHP诡异运算符优先级

PHP的逻辑运算符中&#xff0c;xor表示逻辑异或 $a xor $b 结果 如果 $a 和 $b 有且仅有一个为 true&#xff0c;则返回 true&#xff1b;如果都是true 或 false&#xff0c;则返回false。 然而在测试xor运算符时&#xff0c;发现一点问题 错误情况1 <?php$a false xor tr…

mysql workbench_爬虫实例:玩转mysql(预备篇)

考完试的第一篇文章&#xff0c;开心~/1.什么是数据库/数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。数据库是以一定方式储存在一起、能与多个用户共享、具有尽可能小的冗余度、与应用程…

MongoDB基本命令的使用

成功启动MongoDB后&#xff0c;再打开一个命令行窗口输入mongo&#xff0c;就可以进行数据库的一些操作。 输入help可以看到基本操作命令&#xff1a; show dbs:显示数据库列表 show collections&#xff1a;显示当前数据库中的集合&#xff08;类似关系数据库中的表&#xff0…

RHEL6   Kickstart 无人值守安装

方法&#xff1a;FTPTFTPDHCPKickstartPXE从网络引导系统的做法可以不必从硬盘、软盘或者CD&#xff0d;ROM光盘&#xff0c;而是完全通过网络来引导一台计算机。这对于安装来说很方便&#xff0c;因为它意味着你可以坐在桌子旁边&#xff0c;不必走到机器那里插入CD&#xff0…

免安装免配置 还免费的Spark 集群 --Databrickes Spark Clould

http://ihoge.cn/2018/Databrickes.html 摘要&#xff1a;本文带你畅游Databrickes Spark Clould云服务。小白迅速上手大数据Spark开发环境&#xff0c;从此告别集群Bug的烦恼&#xff0c;彻底解放物理机负担让你随时随地想Run就Run&#xfffd;&#xfffd;。 目录&#xff…

C# 运算符的优先级和关联性

表1 显示了 C#运算符的优先级&#xff0c;其中顶部的运算符有最高的优先级&#xff08;即在包含多个运算符的表达式中&#xff0c;最先计算该运算符&#xff09;。除了运算符优先级&#xff0c;对于二元运算符&#xff0c;需要注意运算符是从左向右还是从右向左计算。除了少数运…

char *a 与char a[] 的区别和char** argv与char *argv[]区别

char *a 与char a[] 的区别 char *a "hello" 中的a是指向第一个字符‘a的一个指针 char a[20] "hello" 中数组名a也是执行数组第一个字符‘h’的指针 但二者并不相同&#xff1a; 看实例&#xff1a;把两个字符串相加&#xff1a; 结果&#xff1a; hell…

javascript设计模式之外观模式

/** 外观模式* 外观模式的主要意义在于简化类的接口&#xff0c;使其易于调用 */// 你常常在不经意中使用了外观模式&#xff0c;尤其类库中更多&#xff08;处理兼容性问题&#xff09; var addEvent function (el, ev, fn) {if (el.addEventListener) {el.addEventListener(…

arduino代码_纯纯小白开发arduino--我的调试经验

arduino 是什么我就不做介绍了。这里的小白并不是说我没有嵌入式开发经验而是说从来没有实际开发过arduino。虽然它在世界范围内都很流行&#xff0c;可是不知为何国内专业做嵌入式开发的人对它大多都嗤之以鼻。我对arduino的想法是&#xff1a;”不管黑猫白猫&#xff0c;抓到…

重要的ui组件——Behavior

v7包下的组件类似CoordinatorLayout推出也有一段时间了&#xff0c;大家使用的时候应该会体会到其中很多的便利&#xff0c;今天这篇文章带大家来了解一个比较重要的ui组件——Behavior。从字面意思上就可以看出它的作用&#xff0c;就是用来规定某些组件的行为的&#xff0c;那…

《转》CXF WebService 开发文档-目录索引

CXF WebService 开发文档-目录索引 上次介绍了Axis的WebService&#xff0c;现在我们来看看CXF是怎么完成WebService的。 Axis1 WebService 在线博文&#xff1a; http://www.cnblogs.com/hoojo/archive/2010/12/20/1911349.html Axis2 WebService 在线博文&#xff1a; http:/…

Spark的基本架构

http://ihoge.cn/2018/IntroductionToSpark.html Spark的基本架构 当单机没有足够的能力和资源来执行大量信息的计算&#xff08;或者低延迟计算&#xff09;&#xff0c;这时就需要一个集群或一组机器将许多机器的资源集中在一起&#xff0c;使我们可以使用全部累积的在一起…

深入 char * ,char ** ,char a[ ] ,char *a[]

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程 1 数组的本质 数组是多个元素的集合,在内存中分布在地址相连的单元中,所以可以通过其下标访问不同单元的元素。 2 指针。 指针也是一种变量,只不过它的内存单元中保…

备份恢复与同步(数据搬运专家)

NewLife.XCode是一个有20年历史的开源数据中间件&#xff0c;支持net6/net5/net45/net40&#xff0c;由新生命团队(2002~2020)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中&#…

简析TCP的三次握手与四次分手

TCP是什么&#xff1f; 具体的关于TCP是什么&#xff0c;我不打算详细的说了&#xff1b;当你看到这篇文章时&#xff0c;我想你也知道TCP的概念了&#xff0c;想要更深入的了解TCP的工作&#xff0c;我们就继续。它只是一个超级麻烦的协议&#xff0c;而它又是互联网的基础&am…

for循环延时_前端中的事件循环eventloop机制

我们知道 js 是单线程执行的&#xff0c;那么异步的代码 js 是怎么处理的呢&#xff1f;例如下面的代码是如何进行输出的&#xff1a;console.log(1);setTimeout(function() { console.log(2);}, 0);new Promise(function(resolve) { console.log(3); resolve(Date.no…

由于未分配内存的指针导致段错误

代码如下 #include<iostream> using namespace std;void f(char **s) {*s "chenyu"; }typedef struct _node {int val;struct _node *next; } Node;typedef struct _link {Node *front;Node *rear; } Link;void queue(Link *link) { // link.front link.rear…