搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
2023面试高手
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
Cause: java.sql.SQLException: 无效的列索引
2
【基于MATLAB的数字图像处理】大作业·综合图像处理平台_图像综合处理
3
Android 特权应用 privapp-permissions 权限解读_priv-app 预授权限
4
2016年第七届java A组蓝桥杯省赛真题_java蓝桥杯竞赛题
5
C++流水线的简易实现_c++ pipeline 例子
6
虚幻4开发入门-房燕良-专题视频课程
7
如何在win11电脑上快速安装安卓应用_win11安装安卓app
8
深度分析 | Unity和Unreal的比较_unreal和unity的区别
9
Android studio | Unused import statement_android studio unused import
10
SSM教师教学质量评价系统 计算机专业毕业设计源码77614_教师教学质量评价管理系统
当前位置:
article
> 正文
extern使用方法总结_extern一个函数怎么用
作者:2023面试高手 | 2024-03-18 16:20:38
赞
踩
extern一个函数怎么用
在c语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此次引用”。
一、extern基本使用方法
1、函数
函数的声明中使用extern关键字是可有可无的,因为函数本身不加修饰的话就是extern的。(函数和全局变量本质上没有区别,函数名时指向函数二进制块开头处的指针,而全局变量时在函数外部声明的变量,函数名也是在函数外,因此函数也是全局的)
2、变量
全局变量在外部使用声明时,必须要有extern关键字(如果变量无extern修饰且没有显式的初始化,则就变为变量的定义编译器在此标记存储空间在执行时加载内存并初始化为0)。
局部变量的声明不能有extern修饰,且局部变量再运行时才在堆栈部分分配内存空间。
二、头文件
头文件里面存放的是关于函数、变量、类的声明(不是定义,不要再头文件里面定义什么东西)。
#ifndef _XXX_头文件_.H
#define _XXX_头文件_.H
...
int A;
#endif
这里的int A是一个全局变量的定义,所以如果这个头文件被多次引用的话,那么A就会被重复定义,显然语法上出现了错误。只不过有了#ifndef的条件编译,所以能保证这个头文件只被引用一次,不过也许还会有问题。若多个c文件包含这个头文件时,因为宏名有效范围仅限于本c源文件,所以在这个多c文件编译时是不会出错的,但在链接时就会报错,说你多处定义了同一个变量。所以在头文件中最好不要定义变量等。
三、extern使用时最让人迷惑的地方是让人搞不清楚使用extern的地方是声明还是定义。下面分别就变量和函数举例说明。
(1)变量
<1> extern int a; //声明一个全局变量a
<2> int a; //定义一个全局变量a
<3> extern int a = 0; // 定义一个全局变量a,并赋初值0
<4> int a = 0; // 定义一个全局变量a,并赋初值0
(2)函数
函数定义的时候使用extern,说明这个函数是可以被外部引用的,声明的时候用extern说这是一个声明。但由于函数的定义和声明有区别,定义韩式要有函数体,声明函数没有函数体,所以函数定义和声明时都可以将extern省去,反正其它文件也是知道这个函数是在其他什么地方定义的,所以不加extern也行。
四、总结:
1、对于变量而言,如果你想在本源文件中使用另一个源文件中定义的变量,就需要在使用前用extern声明该变量,或者在头文件中用extern声明该变量;
2、对于函数而言,如果你想在本源文件中使用另一个源文件中定义的函数,就需要在使用前声明给函数,声明函数加不加extern都没有关系,所以在头文件中函数可以不用加extern。
3、extern用在变量声明中常常有这样一个作用,你在*.c文件中声明了一个全局的变量,这个全局的变量如果要别引用,就放在*.h中并用extern来声明。
4、如果函数的声明中带有关键字extern,仅仅说明这个函数可能在别的源文件里定义,没有其他作用,既如下两个函数声明没有区别:
extern int f();和int f();
5、如果定义函数的c/cpp文件在对应的头文件中声明了定义的函数,那么在其他c/cpp文件中要使用这些函数,就只需要包含这个头文件即可。如果你不想包含头文件,那么就要在本c/cpp文件中声明该函数。一般来说,声明定义在本文件的函数不用extern,声明定义在其他文件中的函数用extern,这样在本文件中调用别的文件定义的函数时就不用包含头文件。
使用extern和包含头文件来引用函数有什么区别呢?
extern的引用方式比包含头文件哟啊简洁的多。extern的使用方法是直接了当的,想引用哪个函数就用extern声明哪个函数。这样做有一个明显的好处是,会加速程序的编译(预处理)的过程,节省时间,在大型c程序的编译过程中,这种差异很明显。
6、此外,extern修饰符可以用于指示C或者C++函数的调用规范。比如C++中调用C库函数,就需要在C++程序用extern "C"生声明引用的函数。这是给连接器用的,告诉连接器在链接的时候用C函数规范来链接。主要是C++和C程序编译完成后在目标代码中命名规则不同。
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/2023面试高手/article/detail/264287
推荐阅读
article
Linux
相关面试题:介绍
Linux
的
几种
文件
类型
_
块
设备
文件
...
Linux
中
的
文件
类型
由
文件
的
第一个属性字符表示。常见
的
文件
类型
包括
块
设备
文件
(b)和字符
设备
文件
(c)。此外,共享内存...
赞
踩
article
Linux
sed
命令实现
替换
文本
内容
_
sed
替换
文件
里
的
内容
...
方案一:
sed
-e 's/localhost:7051/peer0.org1.example.com:7051/' -...
赞
踩
article
最全的
Oracle
到高斯
数据库
的
SQL
语法
迁移手册(建议收藏)_高斯
数据库
和
oracle
数据库
数据传...
异构
数据库
的迁移(譬如从
Oracle
迁移到openGauss)工作主要包括三个方面,
数据库
对象的迁移;数据内容的迁移,主...
赞
踩
article
【
linux
系统】如何在
服务器
上
安装
Anaconda
_华为昇腾
服务器
安装
anaconda
...
输入conda config --set auto_activate_base false可设置不自动进入base环境,...
赞
踩
article
解决Lin
u
x
系统
下
U盘
只读
文件
系统
问题_
lin
u
x
u
盘
只读
文件
系统
...
三行命令教你解决
lin
u
x
系统
下
U盘
只读
文件
系统
问题 1.问题:使用
lin
u
x
不管是centos还是
u
...
赞
踩
article
机器人
导航
技术
的
研究
现状和
发展趋势
_
机器人
导航
与
定位
技术
是
机器人
底层
技术
...
机器人
导航
技术
的
研究
现状和
发展趋势
1
导航
技术
的
研究
现状1.1 路基无线电
导航
系统1.2 蜂窝
导航
1.3 惯性
导航
1.4...
赞
踩
article
Android
如何动态
改变
桌面图标
和
label
_
android
改变
lable
的内容...
记录一下:客户拿着样机演示,
桌面图标
和
label
居然可以动态
改变
,然后要我实现类似功能。百度了好多文章 ,发现都没有用。...
赞
踩
article
Python
如何
打包
exe
文件
?如何换成喜欢的
图标
?_
python
打包
成
可执行
文件
图标
...
嗨喽,大家好呀~这里是爱看美女的茜茜呐今天又想来分享一个
Python
打包
exe
文件
的教程!!这次是最强终极版~~~~在我...
赞
踩
article
SHELL05
-
sed
基本
用法
sed
文本
块
处理
、
sed
高级应用_
sed
块匹配...
NSD SHELL DAY05案例1:
sed
基本
用法
案例2:使用
sed
修改系统配置案例3:
sed
多行
文本
处理
案例4:se...
赞
踩
article
mysql
COLLATE
=
utf8mb4
_
unicode
_ci_collate
utf8mb4
_...
记一次
mysql
COLLATE
=
utf8mb4
_
unicode
_ci的坑场景1:子查询时, 两张表的字符集编码不同,需...
赞
踩
article
Android
开发实用小技巧五——调用
网络
接口
API
并处理返回结果(
json
)_
android
//...
调用
网络
接口
API
并处理返回结果(
json
)。_
android
// 自定义
网络
事件
接口
android
// 自定义
网络
...
赞
踩
article
移动
端
h5
网页、
微信
网页
调试
之利用
vConsole
真机
调试
+显示
控制台
打印信息
、
调试
接口(附带
vue
...
PC页面,我们可通过F12打开
控制台
,查看日志信息,便于测试
调试
。但放到移动
端
中,移动
端
是没有
控制台
的,我们就无法查看...
赞
踩
article
关于
c
和
c
++
里
全局变量
或者设备配置信息定义的要点汇总,
extern
_#
define
extern
...
这
里
还是有细微的差别。 现在梳理一下1 在
c
的环境
里
my_vary.h头文件定义如下:#ifndef MY_VARY_H...
赞
踩
article
用
c
写个
控制
台
下的
进度条
_g
c
c
控制
台
进度条
...
最近想写个
控制
台
下的
进度条
,可以知道程序的进展情况,不用弄个界面。其中最主要的就是“/b“字符,它的as
c
ii码值是10...
赞
踩
article
手绘
几何图形
识别
(上)...
手绘
几何图形
具有的特点是,随意、简单、可以迅速的表达设计师对产品的设想,有利于捕捉生活中得到的一些灵感。绘图工具中,需要...
赞
踩
article
Linux 查看
文件类型
_
linux
查看
文件类型
...
使用带-l选项的ls命令可以查看
文件类型
如图,命令显示的第一个字符就是
文件类型
。不同的
文件类型
用不同的符号表示,常见有以...
赞
踩
article
Android
回调
机制_
android
从
浏览器
回调
到应用会
调用
哪个
方法
...
Android
回调
机制一、
回调
函数
回调
函数就是一个通过函数指针
调用
的函数。如果你把函数的指针(地址)作为参数传递给另...
赞
踩
article
linux
系统下安装
ana
conda
3
及
conda
创建
虚拟环境
及
使用
详细讲解_
linux
使用
an...
1、
linux
系统下安装
ana
conda
3
ana
conda
的官方网站地址:https://www.ana
conda
.co...
赞
踩
article
linux
学习笔记--
文件
操作
常用命令
_
centos
mv
保留原
属性
...
linux
常用的
文件
操作命令ls -l -a 显示
文件
,-l参数长格式显示,更加具体,-a表示全部显示,会显示一些隐...
赞
踩
article
谈谈如何
使用
opencv
进行
图像识别
_
opencv
图像识别
...
原文由hakaboom发表于TesterHome社区,点击原文链接可与作者直接交流。1)前言从18年开始,我接触了叉叉助...
赞
踩
相关标签
linux
服务器
运维
c语言
unix
sed
oracle
sql
gaussdb
机器人
导航技术
研究现状
动态改变icon和label
launcher3
python
pycharm
开发语言
mysql
android
java
android studio
vue.js
前端
javascript