程序小白
认证:优质创作者
所在专题目录 查看专题
不一样的宏定义(C语言小知识)
函数的调用和回调(OS小知识)
C语言指针数组(C语言小知识)
C语言中函数调用与堆栈详解
被C标准和编译器选项给狠狠的上了一课
extern "C" 的意义?——盘一下GCC!
作者动态 更多
小小调度器——开局default,优雅总藏于细节之中
04-02 09:23
小小调度器——调度器核心的纯C实现
04-01 14:09
小小调度器——原来C代码还能这么写,原作者没少挨打吧!
03-27 15:42
解析由系统库引发的hardfault血案(RT-Thread+ESP32)
2023-07-17 16:04
TINA瞬时现象仿真分析——运放缓冲器振铃
2023-02-28 11:38

extern "C" 的意义?——盘一下GCC!

==== 《知其然篇》 ====

   在分析各种源码库时,经常会遇到extern “C”好奇了好久,也没去深入研究一下他到底有什么作用?为什么要加呢?先来看一下extern "C"出现的样子。

=================================extern "C"的作用=================================

其实这个用法在头文件中用的比较多,也就是我们所说的.h文件,那么为什么要在头文件中加入这个玩意儿呢。

解释:因为头文件在编译器的预处理阶段会被包含进相应的源文件中,而源文件会有两种不同的编译规则,C语言规则和C++语言规则,于是乎,就会出现一个#ifdef __cplusplus的宏,用来盘问一下,这个代码内嵌的源码到底是以什么规则进行编译的?

我们大概知晓了,extern "C"是用来限制编译的编译规则的,而且是文件内局部进行限定的,他并不是要将源文件一网打尽,因为C和C++这对好兄弟一般都不是分家的。

==== 来盘一下GCC编译器 ====

上面我们了解到C和C++虽然是一对不分家的兄弟,但是他们的性格(编译规则)是完全不同的,所以如果你不清晰的告诉GCC编译器,它可能也很难完全分清这对兄弟。

GCC编译器集成了C和C++两种语言的编译规则,那什么时候用那种规则进行编译呢?

xxx.c:默认以编译 C 语言程序的方式编译此文件。

xxx.cpp:默认以编译 C++ 程序的方式编译此文件。

这么来看不是挺清楚的吗?为啥还需要用extern c 来指定某一段代码用c格式来编译?

首先你要明白一点,.h文件最终是要被包含进行源文件中进行编译的,源文件可能是.c文件,也可能是.cpp文件。

其次,你要明白.h文件的作用是什么,他仅仅是个接口文件,源文件的调用接口,实际提供功能的还是某个特定的源文件,你无法通过.h文件本身知晓其对应用源文件是c文件还是cpp文件。

.h文件通常会被以#include的形式包含到某个特定的源文件,那么尴尬的事情就发生了。

==== C/C++编译规则的差异,举个例子 ====

假如:一个.cpp文件调用了一个接口.h的文件想要调用其API,这时候会有两种情况,假如.h文件的API对应在.cpp文件中,那么不会有任何问题,但如果这个API函数是由.c文件提供的支持,那就尴尬了,因为编译器处理完之后,会发现同一个函数,其名字不一致,从而导致编译器无法进行有效的连接,而给你一个大大的ERROR.

==== C/C++为什么要做成混合编程? ====

C和C++通常是可以混合编程的,因为在long long ago 之前,那时候是C语言的天下,很多的库都是以C的规则编写的,后来有了C++,曾也有人想过,要把C规则的库全部用C++重写一遍,但是工作量之大,这个想法根本不现实。于是乎,C++就得兼容着那些C库去用,于是乎就不得不兼容C,于是有了extern "C"来协调他们的关系。

声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
觉得内容不错的朋友,别忘了一键三连哦!
赞 6
收藏 3
关注 115
成为作者 赚取收益
全部留言
0/200
成为第一个和作者交流的人吧