extern "C" 使用总结

本贴最后更新于 1930 天前,其中的信息可能已经物是人非

在 C++ 源代码中,我们经常会看到下面的代码:
#ifdef _cplusplus
extern "C" {
#endif

/* ..... */

#ifdef _cplusplus
#endif
那么它的作用是什么呢,其实 extern "C"是 C++ 中的一种声明,它是告诉编译器将这部分代码按照 C 语言的形式进行编译和链接,我们都知道,
C 和 C++ 编译器对函数和变量的处理是完全不同的,因此,为了使得 C 语言和 C++ 语言能互相调用,我们必须要约定它们之间的形式统一,以使得
C 和 C 语言能互相之间能互相调用,这也就是 extern "C"的作用。如果不存在两者之间的互相调用,则不需使用 extern "C"进行声明。
下面举例来说明:
(1)C 语言中调用 C++ 的函数或变量
TestCpp.cpp
0996e7adb83c4df08a030408fd7ff97f.png
TestC.c 中调用上面 cpp 中全局变量和函数 add
410bcf41e91a4e20b6faa4676ff3fa07.png
这个时候我们运行程序的时候会提示找不到符号
f2598e2612a74e99a8431e910d64df5e.png
这是因为 C++ 方式编译的符号和 C 使用的符号不统一,导致 C 链接时找不到该符号,如果这是使用 extern "C" 修饰 C++ 变量和函数,则 C++ 编译
时会使用 C 语言的方式,这是 C 语言链接时则能正确找到符号,TestCpp.cpp 改成下面的形式:
9349a65a2f664802903e21802f6c46c7.png
这时候 C 语言能正常链接起来。
在我们实际的项目中,我们会涉及到很多这样的需要被 C 调用的函数和变量,这时我们统一把这些使用 extern "C" {}声明,这里添加一个 Test.h 文件
TestCpp.cpp
0aefba1d322043ba9d5c7c1ecdbc15cc.png
TestC.c
f6df420216cf44748f0b4a5908e80e37.png
Test.h
c1391a3addf7467192e2844456b3092b.png
(2)在 C++ 中调用 C 语言
这里我们只把两个源文件内容对换,头文件因为有预编译宏__cplpusplus 我们不需要做任何改变
TestCpp.cpp
0df986dbfe994fe783503709926c1636.png
TestC.c
690b74e46bef45959579423322da2da8.png

总之,extern "C"是在 C++ 中使用的一种声明,它的作用就是编译工具安装 C 语言的方式去进行编译和链接,以达到 C 与 C++ 之间互调的目的。

  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    534 引用 • 3528 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 292 关注
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 370 关注
  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    17 引用 • 236 回帖 • 418 关注
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    22 引用 • 31 回帖 • 3 关注
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 23 关注
  • RESTful

    一种软件架构设计风格而不是标准,提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    30 引用 • 114 回帖
  • 一些有用的避坑指南。

    69 引用 • 93 回帖
  • Sillot

    Sillot (汐洛)孵化自思源笔记,致力于服务智慧新彖乄,具有彖乄驱动、极致优雅、开发者友好的特点
    Github 地址:https://github.com/Hi-Windom/Sillot

    17 引用 • 6 回帖 • 26 关注
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    476 引用 • 899 回帖
  • CodeMirror
    1 引用 • 2 回帖 • 121 关注
  • Webswing

    Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用

    1 引用 • 15 回帖 • 635 关注
  • 锤子科技

    锤子科技(Smartisan)成立于 2012 年 5 月,是一家制造移动互联网终端设备的公司,公司的使命是用完美主义的工匠精神,打造用户体验一流的数码消费类产品(智能手机为主),改善人们的生活质量。

    4 引用 • 31 回帖 • 7 关注
  • 七牛云

    七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化 PaaS 服务。围绕富媒体场景,七牛先后推出了对象存储,融合 CDN 加速,数据通用处理,内容反垃圾服务,以及直播云服务等。

    25 引用 • 217 回帖 • 159 关注
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 547 关注
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    76 引用 • 37 回帖
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    5 引用 • 26 回帖 • 495 关注
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    85 引用 • 895 回帖
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 462 关注
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    21 引用 • 58 回帖
  • sts
    2 引用 • 2 回帖 • 152 关注
  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖 • 5 关注
  • 创业

    你比 99% 的人都优秀么?

    82 引用 • 1398 回帖 • 1 关注
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 345 关注
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖
  • 国际化

    i18n(其来源是英文单词 internationalization 的首末字符 i 和 n,18 为中间的字符数)是“国际化”的简称。对程序来说,国际化是指在不修改代码的情况下,能根据不同语言及地区显示相应的界面。

    7 引用 • 26 回帖 • 2 关注
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 521 关注
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 109 关注