extern "C"语句的作用

马谦马谦马谦 C/C++评论1961字数 600阅读 2 分 0 秒阅读模式

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-9-15
马谦马谦马谦
  • 本文由 马谦马谦马谦 发表于 2019 年 3 月 15 日 10:25:01
  • 转载请务必保留本文链接:https://www.dyxmq.cn/program/code/c-cpp/extern-c-in-cpp.html
C++文件输入输出流fstream的基本用法 C/C++

C++文件输入输出流 fstream 的基本用法

一、文件流 C++的 IO 类中定义了三个文件读写流 fstream 、 ifstream 以及 ofstream,它们都继承于相同的父类 istream,通过不同的实现以实现不同的文件流操作。 三者的区别为: if...
C++11中const_cast的真实使用场景 C/C++

C++11 中 const_cast 的真实使用场景

一、 const 和成员函数的故事 const 的用途有以下几种: 修饰全局、局部、成员变量 修饰成员函数 修饰变量的时候 const 限制了变量在整个程序运行期间都是不能修改的,而修饰成员函数的时候限制函数内...
C++11中的override和final关键字 C/C++

C++11 中的 override 和 final 关键字

一、前言 昨天在公司做代码扫描,发现很多类似以下的代码都产生了告警,导致扫描不通过: virtual int func() override {} 不通过的原因是:同时使用 virtual 和 overri...
匿名

发表评论

匿名网友
:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:
确定

拖动滑块以完成验证