一文说清:C和C++混合编程

一 引言

在编写c或c++工作时,经常会看到如下代码:

cpp 复制代码
#ifdef __cplusplus 
extern "C" { 
#endif

//具体项目代码

#ifdef __cplusplus 
} 
#endif 

到底是什么含义呢?下面来详细解释一下。

二 先看__cplusplus

#ifdef __cplusplus 是预处理器指令,用于检查预处理器宏 _cplusplus 是否被定义。

如果定义了 _cplusplus,则说明当前编译环境是C++编译器。

三 再看extern "C"

extern "C" 是C++中的一个特殊的声明,用于告诉C++编译器,被这个声明包围的代码,应该按照C语言的链接规则(name mangling)来处理。

1 原因分析

在C++中,函数名在编译时会经过一个叫做"名称修饰"(name mangling)的过程,以区分同名的函数(例如,参数类型不同的函数)。

这导致C++编译器生成的符号名称,与C语言编译器生成的符号名称不同。

2 示例代码

看个例子。

以下函数,在不同情况下的编译结果不同。

cpp 复制代码
int f(void) { 
	return 1; 
} 

3 加extern "C"的编译结果

产生的汇编代码是:

复制代码
.globl _f 
//函数汇编代码 
_f: 

可以看出其函数名称为_f,基本未加修饰,仅添加了下划线。

4 不加extern "C"的编译结果

产生的汇编代码是:

复制代码
.globl __Z1fv 
//函数汇编代码
__Z1fv: 

函数名变为__Z1fv,加了一些修饰,通常与参数有关。

5 小结

加上extern "C",就是告诉编译器:

这是用c写的代码,请用c的方式来链接它们。

四 总结

当C++代码需要调用C语言库中的函数,或者C语言代码需要调用C++代码中的函数时,需要使用 extern "C" 来避免名称修饰,确保C++代码和C语言代码可以正确链接。

开头形式的代码,其目的是,确保只有在C++编译器中才编译这段代码,保证c和c++混合编程时的正确编译和链接。

相关推荐
今儿敲了吗1 分钟前
51| 八皇后
c++·笔记·学习·算法·深度优先
maverick_11110 分钟前
【FPGA】关于两个数相加的“坑”
c语言·matlab·fpga开发
玖釉-12 分钟前
暴力美学与极致性能:深度解析 Meshoptimizer 的 Sloppy 减面算法
c++·windows·图形渲染
Darkwanderor12 分钟前
搜索优化——迭代加深dfs
c++·算法·深度优先·迭代加深
计算机安禾24 分钟前
【数据结构与算法】第17篇:串(String)的高级模式匹配:KMP算法
c语言·数据结构·学习·算法·visual studio code·visual studio·myeclipse
每天回答3个问题34 分钟前
LeetCodeHot100|对称二叉树、二叉树的直径、二叉树的层序遍历
数据结构·c++·ue4·
nianniannnn34 分钟前
力扣 3.无重复字符的最长子串
c++·算法·leetcode
羊小猪~~36 分钟前
【QT】-- 模型与视图简介
开发语言·数据库·c++·后端·qt·前端框架·个人开发
水饺编程1 小时前
第4章,[标签 Win32] :SysMets3 程序讲解02,iVertPos
c语言·c++·windows·visual studio
Hello-FPGA1 小时前
视觉软件工程师(机器视觉 / 科学成像方向)
c++