ToB企服应用市场:ToB评测及商务社交产业平台

标题: 一文说清:C和C++混合编程 [打印本页]

作者: 郭卫东    时间: 2024-11-24 03:06
标题: 一文说清:C和C++混合编程
一 弁言

在编写c或c++工作时,经常会看到如下代码:
  1. #ifdef __cplusplus
  2. extern "C" {
  3. #endif
  4. //具体项目代码
  5. #ifdef __cplusplus
  6. }
  7. #endif
复制代码
到底是什么含义呢?下面来具体解释一下。
二 先看__cplusplus宏

#ifdef __cplusplus 是预处置处罚器指令,用于检查预处置处罚器宏 _cplusplus 是否被界说。
如果界说了 _cplusplus,则说明当前编译环境是C++编译器。
三 再看extern "C"

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

在C++中,函数名在编译时会颠末一个叫做“名称修饰”(name mangling)的过程,以区分同名的函数(例如,参数类型不同的函数)。
这导致C++编译器生成的符号名称,与C语言编译器生成的符号名称不同。
2 示例代码

看个例子。
以下函数,在不怜悯况下的编译结果不同。
  1. int f(void) {
  2.         return 1;
  3. }
复制代码
3 加extern "C"的编译结果

产生的汇编代码是:
  1. .globl _f
  2. //函数汇编代码
  3. _f:
复制代码
可以看出其函数名称为_f,基本未加修饰,仅添加了下划线。
4 不加extern "C"的编译结果

产生的汇编代码是:
  1. .globl __Z1fv
  2. //函数汇编代码
  3. __Z1fv:
复制代码
函数名变为__Z1fv,加了一些修饰,通常与参数有关。
5 小结

加上extern “C”,就是告诉编译器:
这是用c写的代码,请用c的方式来链接它们。
四 总结

当C++代码需要调用C语言库中的函数,大概C语言代码需要调用C++代码中的函数时,需要使用 extern "C" 来避免名称修饰,确保C++代码和C语言代码可以准确链接。
开头形式的代码,其目的是,确保只有在C++编译器中才编译这段代码,包管c和c++混合编程时的准确编译和链接。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4