参考:C语言正确使用extern关键字
作者:xingjiarong
发布时间:2015-08-14 08:37:33
网址:https://blog.csdn.net/xingjiarong/article/details/47656339

目录

  • 1、引用同一个文件中的变量
  • 2、引用另一个文件中的变量
  • 3、引用另一个文件中的函数

利用关键字extern,可以在一个文件中引用另一个文件中定义的变量或者函数,下面就结合具体的实例,分类说明一下。

1、引用同一个文件中的变量

#include<stdio.h>int func();int main()
{func(); //1printf("%d",num); //2return 0;
}int num = 10;int func()
{printf("%d\n",num);
}

如果按照这个顺序,变量 num在main函数的后边进行声明和初始化的话,那么在main函数中是不能直接引用num这个变量的,因为当编译器编译到这一句话的时候,找不到num这个变量的声明,但是在func函数中是可以正常使用,因为func对num的调用是发生在num的声明和初始化之后。

如果我不想改变num的声明的位置,但是想在main函数中直接使用num这个变量,怎么办呢?可以使用extern这个关键字。像下面这一段代码,利用extern关键字先声明一下num变量,告诉编译器num这个变量是存在的,但是不是在这之前声明的,你到别的地方找找吧,果然,这样就可以顺利通过编译啦。但是你要是想欺骗编译器也是不行的,比如你声明了extern int num;但是在后面却没有真正的给出num变量的声明,那么编译器去别的地方找了,但是没找到还是不行的。

下面的程序就是利用extern关键字,使用在后边定义的变量。

#include<stdio.h>int func();int main()
{func(); //1extern int num;printf("%d",num); //2return 0;
}int num = 10;int func()
{printf("%d\n",num);
}

2、引用另一个文件中的变量

如果extern这个关键字就这点功能,那么这个关键字就显得多余了,因为上边的程序可以通过将num变量在main函数的上边声明,使得在main函数中也可以使用。

extern这个关键字的真正的作用是引用不在同一个文件中的变量或者函数。

main.c

#include<stdio.h>int main()
{extern int num;printf("%d",num);return 0;
}

b.c

#include<stdio.h>int num = 10;void func()
{printf("fun in a.c");
}

例如,这里b.c中定义了一个变量num,如果main.c中想要引用这个变量,那么可以使用extern这个关键字,注意这里能成功引用的原因是,num这个关键字在b.c中是一个全局变量,也就是说只有当一个变量是一个全局变量时,extern变量才会起作用,向下面这样是不行的。

mian.c

#include<stdio.h>int main() {extern int num;printf("%d",num);return 0;
}

b.c

#include<stdio.h>void func() {int num = 5;printf("fun in a.c");
}

另外,extern关键字只需要指明类型和变量名就行了,不能再重新赋值,初始化需要在原文件所在处进行,如果不进行初始化的话,全局变量会被编译器自动初始化为0。像这种写法是不行的。

extern int num=4;

但是在声明之后就可以使用变量名进行修改了,像这样:

#include<stdio.h>int main()
{extern int num;num=1;printf("%d",num);return 0;
}

如果不想这个变量被修改可以使用const关键字进行修饰,写法如下:

mian.c

#include<stdio.h>int main()
{extern const int num;printf("%d",num);return 0;
}

b.c

#include<stdio.h>const int num=10;
void func()
{printf("fun in a.c");
}

使用include将另一个文件全部包含进去可以引用另一个文件中的变量,但是这样做的结果就是,被包含的文件中的所有的变量和方法都可以被这个文件使用,这样就变得不安全,如果只是希望一个文件使用另一个文件中的某个变量还是使用extern关键字更好。

3、引用另一个文件中的函数

extern除了引用另一个文件中的变量外,还可以引用另一个文件中的函数,引用方法和引用变量相似。

mian.c

#include<stdio.h>int main()
{extern void func();func();return 0;
}

b.c

#include<stdio.h>const int num=10;
void func()
{printf("fun in a.c");
}

这里main函数中引用了b.c中的函数func。因为所有的函数都是全局的,所以对函数的extern用法和对全局变量的修饰基本相同,需要注意的就是,需要指明返回值的类型和参数

C语言extern关键字(去使用外部全局变量、函数)相关推荐

  1. c语言extern关键字注意事项

    c语言中,用extern关键字来修饰一个变量,表示这个变量具有外部链接. 但是不要用extern变量去创建外部定义,即 extern int a; int main(void) {printf(&qu ...

  2. C语言extern关键字

    C语言正确使用extern关键字 利用关键字extern,可以在一个文件中引用另一个文件中定义的变量或者函数 extern关键字,C语言extern关键字用法详解

  3. C语言应用笔记(六):C语言extern关键字及其使用

    C 语言中,修饰符 extern 用在变量或者函数的声明前面,用来标识变量或函数的定义在别的文件中,提示编译器遇到此变量或函数时,在其他文件中寻找其定义.下面对 extern 关键字的几种用法进行说明 ...

  4. C语言学习及应用笔记之六:C语言extern关键字及其使用

    在C语言中,修饰符extern用在变量或者函数的声明前,用来以标识变量或者函数的定义在别的文件中,提示编译器遇到此变量或者函数时,在其它文件中寻找其定义.extern关键字的用法有几种,我们下面对其进 ...

  5. C语言extern关键字的作用

    1.引用同一个文件中的变量 #include<stdio.h>int func();int main() {func(); //1printf("%d",num); / ...

  6. C语言 extern关键字 实例

    如果需要在一个源文件中引用另外一个源文件中定义的变量,我们只需在引用的文件中将变量加上 extern 关键字的声明即可.(来自菜鸟教程) add.c: #include <stdio.h> ...

  7. c语言extern关键字详解

    在c语言中代码的执行顺序是从上往下执行的,如果定义的函数或者变量在调用之后,那么调用的时候编译就会找不到需要使用的变量.这样就会出现错误,如下代码: #include<stdio.h>in ...

  8. c语言关键字extern作用,c语言extern关键字详解

    标签: 在c语言中代码的执行顺序是从上往下执行的,如果定义的函数或者变量在调用之后,那么调用的时候编译就会找不到需要使用的变量.这样就会出现错误,如下代码: #include int main(){ ...

  9. C语言extern关键字定义外部变量--Redis源码extern使用

    在Redis2.8中有networking.c,这个文件没有networking.h networking.c首先引入redis.h这个头文件 #include "redis.h" ...

最新文章

  1. 嵌入式视频处理考虑(一)
  2. insight-vmi 编译中的问题
  3. [概统]本科二年级 概率论与数理统计 第四讲 连续型随机变量
  4. 74 计算机图形学开源处理库
  5. error: missing or invalid dependency detected while loading class file 'RDD.class'.
  6. (10)C#偷懒的开始永无止境的循环?
  7. 弱电工程标书制作,从入门到精通
  8. 当年发明“熊猫烧香”病毒的天才,如今怎么样了?
  9. dep指定版本 go_将 dep 更换为 go mod
  10. 京东物流数据安全体系
  11. 手机摄像头的等效焦距
  12. ARM GICv3 GIC代码分析
  13. 微信开放平台 帐号管理 绑定在同一个开放平台帐号下的公众号及小程序让用户unionid一致...
  14. JAVAEE学习day02
  15. android 展示大图,Android 加载超大图(原图)分析
  16. js判断身份证号码是否正确
  17. 做好这三步,你的小程序离“爆款”就不远了
  18. the markup in the document preceding the root element must be well-formed
  19. c语言字母意义,C语言 字符串前加L的意义 如:L“A”
  20. 分享本年度最佳的15个 Photoshop 实例教程

热门文章

  1. 13 代码分割之import静动态导入
  2. C++总结笔记(一)—— 基础知识汇总
  3. 深度学习之pytorch(二) 数据并行
  4. c和c++的结构体使用
  5. java concurrent 锁_java并发机制锁的类型和实现
  6. C语言扫雷游戏简单实现
  7. c语言输出去掉最后一行回车,新人提问:如何将输出时每行最后一个空格删除...
  8. bean.xml配置数据源和读取配置文件配置数据源
  9. 数组各元素出现的次数
  10. jq关于对象类型的判断