搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
羊村懒王
这个屌丝很懒,什么也没留下!
关注作者
热门标签
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
android SrollView的内容发生变化时自动滚动的处理_android scrollview因内容改自己滚动
2
Mel spectrum梅尔频谱与MFCCs_梅尔频谱和mfcc区别
3
一文解读:Stable Diffusion 3究竟厉害在哪里?_stable diffusion 3 rectified flows
4
云安全与云计算的关系
5
java中upload怎么用_SpringMVC上传文件FileUpload使用方法详解
6
鸿蒙打包Flutter为HAP流程_flutter怎么打包hap
7
小米安卓春招面试一面
8
Soft Robotics:两栖环境下螃蟹仿生机器人的行走控制
9
微信开发者工具开通云开发流程_开通微信云开发
10
鸿蒙HarmonyOS系统应用开发|接口描述语言构成_harmony定义java数组
当前位置:
article
> 正文
C/C++中extern的作用_c++ extern有什么用
作者:羊村懒王 | 2024-03-25 13:00:19
赞
踩
c++ extern有什么用
extern "c" 表示函数使用C的连接方式,也就是说能被C语言写的程序调用(C和C++的连接方式是不一样的)。
联想 extern "C++"大概也知道了吧
在C++程序中调用被C编译器编译后的函数,为什么要加extern“C”声明?
因为 C 语言和 C++ 语言的编译规则不一样,所以要告诉系统哪些函数是用 C 方式编译,哪些函数需要用 C++ 方式编译。
如果你不加 extern "C" ,在编译时,系统会提示找不到此函数。
extern "C"表示编译生成的内部符号名使用C约定
例如:
int Fun(int i,int j)
C:_Fun
C++:_Fun_int_int
具体生成什么可能与编译器有关
由于C++支持重载,而重载是在编译期确定的,所以C++必须在内部符号名上区分各重载函数,所以就将参数类型加在函数名后。
extern关键字告诉编译器,“这个变量可能定义在这个模块或其它模块中”,一个extern声明并没有生成数据,它仅表明这个数据是共享的。这个变量必须是在别处定义过的,而且它只能定义一次
例子如下:
extern "C" declaration;
其中"C"是可选的,包括“C”表明这个条目是根据C语言的约定 来声明的。这个特征使得C语言的模块,不必象C++代码需要进行对名字改写和编译而可以直接访问这些条目。
以下是C++Primer上的一段话
如果成员希望呼叫以另一种语言写成的程式,编译器必须控制函式呼叫时的不同需求。例如,c++和其他语言对于汉式命名方式或引数传递次序可能与所不同。
这个问题要涉及一个基本的知识就是你要知道编译器的处理过程是什么的,知道的结果就是了解source file和translation unit的联系和区别。
说简单一点translation unit就是编译器处理过的source file。处理包括词汇分析,预处理等等,对于你的问题,重要是理解#include的处理意思,是包含#include文件内容使之成为本身的一部分。
说到你这个问题,
简单说就是“外部连接”的实体(包括变量,函数等)可以在定义实体的translation unit以外的部分(程序空间)被引用,但是“内部连接”的实体只能在定义实体的translation unit中使用。
去看看汇编中对于obj文件中的名字连接属性的讲解吧。
简单地说就是:一个transunit会编译出一个obj文件,不同的obj文件是分开编译的,在连接时,具有internal linkage的名字不可能被其他的obj文件所使用,只有具有external linkage的名字才可以被别的obj文件所使用。
举例来说就是,一个函数,如果不具有external linkage的话,那它只可以在实现它的那个transunit中被调用,在其他的transunit中被调用会引发linker的一个连接错误。
extern "C"用在C++里表示,被其修饰的函数,类,结构在编译时按照C的编译规则进行,没有mangling
在C++中,由于某种原因,比如重载:不同函数体的函数可能有着相同的名字,当然这是相对于程序员来说,实际上,为了区分这些有着相同名字的重载函数,C++编译器偷偷的在背后给这些函数取了特殊的名字以区分它们,这就被称为C++的mangling。
同样的,类中的变量有可能与类外的变量同名,当然我们编程时可以用"."来区分,而编译器在编译时,则是通过mangling为类中的变量取了一个独一无二的名字,这个名字显然与程序员所取的名字不同。
加了extern "C"后就不会mangling,函数(或类之成员变量)是什么名字,在编译器编译过程中仍然是这个名字,生成的目标文件.obj里这个函数还是这个名字。
extern int a 表示 a是在其它文件中定义的一个变量,需要在这里引用。
a已在别的文件中,所以不需要再分配空间了
extern int a 定义的a变量表示该变量在使用前已经定义了,一般有两种情况,一是该变量是在其他的文件中定义的全局变量,简称外部变量。二种情况表示变量在本文件中定义的全局变量,但是在使用之后(因为作用域)定义的。
extern int a 是对变量的声明,而不是定义,该变量是其他文件中定义的,或是本文件中在该声明之后定义的全局变量。
extern int a;//这是变量声明,是告诉编译器到该文件外部去找这个文件的定义
//声明是不分配内存的
int a;//这是变量定义,变量定义是分配空间的
定义只能有一处,但声明可有多处,这些声明所指,都是定义时分配的内存空间
static和extern都被称为"global"变量(或者函数)。
但是他们的生存周期和可见性是不同。static是文件级,
只有程序文件之间显式的包含才可以引用(主要就是使用#include)
但是extern是程序级的,你不必显式的引用文件的,但需要使用extern
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/羊村懒王/article/detail/310038
推荐阅读
article
(地理国情监测)
arcgis
使用
python
,做
arctoolbox
,
渔网
裁剪
gdb
里的要素,四等分...
arcgis
使用
python
,做
arctoolbox
,
渔网
裁剪
gdb
里的要素,四等分:# ecoding=gbkcodi...
赞
踩
article
基于MM32的oled驱动代码_
write
_
iic
_
byte
(
0x78
);
write
_
iic
_by...
一:屏幕选用的是中景园电子的0.98英寸的oled屏幕模块接口定义:1. GND 电源地2. VCC 电源正(3~5.5...
赞
踩
article
IOUtils
详解——工具
类
学习
...
IOUtils
类
的所有成员字段和方法都是静态的,因此在标准编程中不需要创建
IOUtils
类
的对象,而是通过
类
名和适当的方...
赞
踩
article
Commons
-
io
方法_
io
utils.
tostring
...
Commons
-
io
_
io
utils.
tostring
io
utils.
tostring
...
赞
踩
article
Linux
系统中
etc
/
passwd
文件详解_/
etc
/
passwd
...
Linux
系统中的/
etc
/
passwd
文件是一个非常重要的文件,它保存了系统上所有用户的账户信息。初学者需要了解该文...
赞
踩
article
arcgis
运行
python
脚本时闪退_关于
ArcMap
中打开
ArcToolbox
导致闪退的
解决办法
...
最近好久不用ArcGis的小编要用到
ArcMap
去发送一个GP服务,发现按照套路打开
ArcMap
点击
ArcToolbox
...
赞
踩
article
简单分析与移植
rockchip
平台
mmc
/
sd
卡
_dw
mmc
...
版权声明:本文为博主原创文章,转载请注明出处:https://blog.c
sd
n.net/huang_165/artic...
赞
踩
article
STM32F1
的
oled
模块例程
_
f1
oled
项目组
...
STM32F1
的
oled
模块例程#include “
oled
.h”#include “stdlib.h”#include...
赞
踩
article
ArcGIS
使用模型构建器
批量
导出
属性
表
_
arcgis
批量
导出
属性
表
...
在使用
ArcGIS
处理数据时,可以手动将数据的
属性
表
导出
,但当数据有几百个甚至上千个时,手动
导出
很明显就不是个好的选择。...
赞
踩
article
c++
11 之
type
_
traits
_
type
_
traits
c++
11...
1.
type
_
traits
-类型萃取 (1)
type
_
traits
可以在一定程度上消除 switch-case 或者 i...
赞
踩
article
c#
通过
webView2
模拟登陆
小红书
网页版
,
解析
无
水印
视频
图片
,
以及解决
X
-s,
X
-t签名验证【...
c#
通过
webView2
模拟登陆
小红书
网页版
,
解析
无
水印
视频
图片
,
以及解决
X
-s,
X
-t签名验证。日期:2023-4-...
赞
踩
article
Android
AccessibilityService
无障碍
服创建 与 权限判断
_
android
...
button 按钮的声明 与使用 Button button ; 声明按钮类型的 变量 button = findV...
赞
踩
article
Android
Studio
设置
国内
镜像网站_
android
studio
国内
官网...
我们平时在使用
android
studio
时,难免需要从
android
官网下载一些项目运行所需要的SDK文件,但是因为a...
赞
踩
article
软件
iic
,
hal库
,
oled
,
如何肖习别人
代码
并正确运行_
oled
是
什么
文件
...
本文
是
关于如何使用软件
iic
_驱动四引脚
oled
屏
,
总结一下我白嫖别人
代码
的经验。首先要了解驱动这种
oled
的
代码
需要几...
赞
踩
article
适用于
Ubuntu
11.04
的10个
AppIndicator
_
ubuntu
touchpad
in...
2、Dropbox Application Indicator ( Dropbox 的社区版本,可以在
Ubuntu
1...
赞
踩
article
Unity
中常见
的
报错
类型_
unity
报错
...
2.private情况下
的
Unity
组件,如Transform(如果是public
的
情况,也就是存在面板赋值
的
情况,会报...
赞
踩
article
数据同步工具对比——
SeaTunnel
、
DataX
、
Sqoop
、
Flume
、
Flink
CDC_s...
SeaTunnel
是一个分布式、高性能、支持多种数据源之间高效数据同步的开源工具。它旨在解决大数据处理过程中的数据同步问...
赞
踩
article
ArcGIS
应用(二十八)
遥感
图像
标准化
裁剪
_
裁剪
tif
格式
的
遥感
图像
...
遥感
图像
的
裁剪
有多种方法,比如按照指定
的
shapefile图形
裁剪
,即Arcgis工具箱中
的
Clip工具。Clip工具在...
赞
踩
article
git
代码
撤销
回滚
只
看
这
一篇就足够了!_
代码
回退
...
git
工具下的
代码
撤销
和
回滚
操作是大家经常遇到的一个场景,本篇
只
单独讲一下
这
部分的应用。_
代码
回退
代码
回退
...
赞
踩
article
java
实体类
校验
_
实体类
的验证...
@Valid注解用于
校验
,所属包为:
java
x.validation.Valid。① 首先需要在
实体类
的相应字段上添加用...
赞
踩
相关标签
python
arcgis
算法
学习
unix
java
数据结构
linux
服务器
运维
arcgis运行python脚本时闪退
块设备
模型构建器
批量导出
属性表
c++11
type_traits
c#
开发语言
android
无障碍
Android
Android Studio
设置国内镜像网站