extern “C”语句的作用

马谦马谦马谦
马谦马谦马谦
马谦马谦马谦
606
文章
12
评论
2019年3月15日10:25:01 评论

c++中,调用c语言函数时要对函数添加声明extern "C",这是因为c和c++的符号表机制不一样导致的。

假设存在函数fun,经过gcc编译后,该函数在符号表中的名字是fun,但是经过g++编译后,该函数在符号表中的结果是xxfunxx,c++编译器会在函数两侧加上一些随机字符。因为两者的编译结果不统一,所以混合使用的时候程序找不到符号,无法运行(甚至都无法编译)。一个典型的错误就是(参考实际开发中出现的一个案例:一次undefined reference to *的编译错记录):

extern "C"语句的作用就是告诉c++编译器:我这个是c语言函数,不要按照你的格式来修改这个函数的符号,按照我的标准来就行了。于是c++编译器编译的时候就按照c的规范来,把两者符号统一。

示例

代码中有一个函数add,看看它经过gcc和g++编译后分别变成了什么。

使用gcc编译:

extern

使用g++编译:

extern

两者对比,很明显能看到,使用g++编译后的add函数,符号表前后加上了一些特殊字符。而gcc编译出来的符号就是add本身。

给add函数加上extern "C"声明后:

再次使用g++编译,add的符号就和gcc编译出来的符号一样了:

extern

马谦马谦马谦
  • 本文由 发表于 2019年3月15日10:25:01
  • 转载请务必保留本文链接:https://www.dyxmq.cn/program/code/c-cpp/extern-c-in-cpp.html
给socket分配随机端口 C/C++

给socket分配随机端口

客户端的socket不需要手动执行bind绑定地址,但这不意味着客户端socket真的不需要绑定端口,实际上是内核它帮我们做了这个操作,在执行connect时,内核发现没有绑定端口,就会自动选择一个合...
vector中emplace_back方法的用途 C/C++

vector中emplace_back方法的用途

在写代码的过程中,CLion提醒我把push_back方法替换成emplace_back方法: 代码中我的想法是使用vector创建一个二维数组,并提前分配好空间,避免后序频繁扩容增加时间复杂度。 e...
宏定义踩坑实战:嵌套调用宏定义 C/C++

宏定义踩坑实战:嵌套调用宏定义

问题背景:在刷题的过程中,要使用min函数,但是线上OJ并没有这个函数。因为一时也想不起它到底属于哪个头文件,所以为了偷懒,顺手就写下了以下宏定义: #define min(x, y) (x) <...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: