浅析extern “C”的作用

2023-05-16

浅析extern “C”的作用

 

        关于extern “C”的作用和意思,网上资料已经有很多了(我也参考了几篇),不过我还是觉得有必要自己总结一下,毕竟“好记性不如烂笔头”嘛~~

        到C标准函数库的头文件里看看,一般会经常看见有如下宏定义(除非你从来没有查看类似printf函数在头文件中的定义,就另当别论了:-()

#ifdef  __cplusplus
extern "C" {
#endif
…… (C函数声明)
#ifdef  __cplusplus
}
#endif

        简单来说,这个extern“C”用于C++代码调用C的函数(至于C代码如何调用C++函数,还是问问Google大神吧~)

        先撇开上述的extern “C”,看看C函数和C++函数的汇编代码,就知道在目标文件中,C函数名和C++函数名采用不同的命名规则。

        VS2010新建一个Windows Console工程,添加一个.c和.cpp文件,文件里的代码都一样,如下

void hello()
{

}

        为了使汇编文件的内容简单一些,这里函数体是空,而且没有引入任何头文件。VS2010默认不输出.asm文件,即汇编文件。在工程的配置中,让VS2010输出汇编文件,如下


        编译解决方案(或按“F7”),可以在工程目录的Debug文件夹下,找到对应的两个汇编文件,内容如下


        没有必要把这里全部的汇编代码看懂,只要明白在源代码中同一个hello函数,在翻译过来的.asm文件中,hello函数名的命名不一样就行了。

        很明显,如果C++代码要调用C函数,需要按照C函数编译后的函数名去调用这个函数。所以,extern “C”的作用就是告诉编译器,花括号“{}”中间的这些函数声明全部都是C函数。

        下面修改一下.c和.cpp文件的内容,如下

// C代码
#include <stdio.h>

void hello()
{
	printf("Hello, world!\n");
}
// C++代码
void hello();

int main(void)
{
	hello();
}

        这里要说明下,由于.c和.cpp文件在同一个工程下,所以简单起见,没有使用头文件引入hello函数,这里hello函数是全局的。运行工程发现出错如下


        这里?hello@@YAXXZ就是上面.cpp文件中hello函数编译后出现在对应的.asm文件中的。显然,编译器按照这个名称去找目标文件(.obj文件)中的hello是找不到的,因为.c文件编译后的.obj文件中,hello函数名被改成_hello。

        这时,把extern “C”加到.cpp文件中,如下

extern "C" {
	void hello();
};

int main(void)
{
	hello();
}

        果然,程序可以通过编译运行了。到这里,基本上extern ”C”的作用都讲清楚了。至于__cplusplus宏,用于判断当前源文件是不是C++源文件,因为extern “C”这种写法在C源文件中不允许的,如下,所以使用__cplusplus宏可以避免extern “C”被引入到C源文件中。即

(1)当前源文件是C++,则__cplusplus宏生效,extern “C”以及花括号“{}”的内容被引入C++源代码中;

(2)当前源文件是C,则__cplusplus宏无效,extern “C”以及花括号“{}”的内容不被引入C源代码中。



 

参考资料:

1、http://tech.163.com/06/0118/09/27O66HCC0009159Q.html

2、http://hi.baidu.com/mailrabbit/item/d53990f26265111aa7298876

3、http://blog.csdn.net/norains/article/details/1958052

4、http://luleimi.blog.163.com/blog/static/175219645201281244439794/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

浅析extern “C”的作用 的相关文章

随机推荐

  • Apache Options指令详解

    前言 xff1a Options指令是Apache配置文件中一个比较常见也比较重要的指令 xff0c Options指令可以在Apache服务器核心配置 server config 虚拟主机配置 virtual host 特定目录配置 di
  • 欠驱动机械臂运动学仿真

    这是个目录 三轴机械臂建模及运动学仿真各仿真项目的个人理解三轴机械臂 xff08 欠驱动 xff09 分析难点更改RTB中逆解求解源码求解析解数值求解工作空间筛选 实用的解析解法总结 三轴机械臂建模及运动学仿真 在开始具体的机械结构及驱动结
  • postman安装使用教程(标贝科技)

    postman安装使用教程 文章目录 postman安装使用教程前言一 postman安装二 postman使用 前言 postman是Chrome浏览器的插件 xff0c 是一款功能强大的网页调试工具 xff08 接口调试神器 xff09
  • 流媒体推流原理

    我们知道一个完整的直播过程 xff0c 包括采集 处理 编码 封包 推流 传输 转码 分发 解码 播放等 xff0c 这一过程所采用的技术 xff0c 我们也称之为 流媒体技术 其中推流是指使用推流工具等内容抓取软件把直播内容传输到服务器的
  • 机器学习必知必会10大算法!

    Datawhale干货 作者 xff1a Fahim ul Haq xff0c 编译 xff1a InfoQ 现在 xff0c 机器学习有很多算法 如此多的算法 xff0c 可能对于初学者来说 xff0c 是相当不堪重负的 今天 xff0c
  • C语言结构体及链表定义

    最近在看 大话数据结构 xff0c 一边看书一边跑一下书中的案例 xff0c 加深下理解 书中的案例都是C写的 xff0c 顺便熟悉下C语言 此处第三章线性表链式存储 xff1a 在用代码描述单链表之前 xff0c 我们需要定义一个结构体来
  • 【ROS教程 005】ROS可视化

    在ROS系统中它可以通过一些通用工具轻松绘制标量数据图 xff0c 它要求对每一个标量字段数据分别绘制成二维曲线 xff08 1 xff09 用rxplot画出时间趋势曲线 在ROS系统中 xff0c 标量数据可以根据消息中提供的时间戳作为
  • C/C++/Windows/VC/MFC/Unix/Linux编程书籍推荐

    C C 43 43 编程书籍 C Primer Plus C 43 43 Primer C 43 43 Primer Plus C和指针 C陷阱与缺陷 C专家编程 C 43 43 沉思录 C语言深度剖析 Effective C 43 43
  • 使用CPM管理CMake C++工程中的外部依赖库

    严正声明 xff1a 本文系作者davidhopper原创 xff0c 未经许可 xff0c 不得转载 众所周知 xff0c 对于外部依赖库的管理是CMake C 43 43 工程中一个令人头疼的问题 人们一直希望能有一个工具来自动配置CM
  • 字典和集合2:高效性和可哈希

    目录 1 字典和集合的高效性 2 散列表操作 2 1 散列表的写入 2 2 散列表的查找 2 3 散列表的缺点 3 可哈希 1 字典和集合的高效性 许多时候 xff0c 将列表改为字典或集合后 xff0c 执行效率将会有巨大的飞跃 xff0
  • 卡尔曼滤波(Kalman filter)公式推导详细版

    卡尔曼滤波 xff08 Kalman filter xff09 公式推导详细版 记得很早的时候 xff0c 我曾经手工推导过卡尔曼滤波 xff0c 但是之前的已经大多记不起来了 今天帮着老师整理PPT的时候 xff0c 老师让我补充完相应的
  • 4g dtu透传模块

    4g dtu透传模块 xff0c 是一款支持双向透明传输的产品 xff0c 用户使用无需关心复杂的协议 xff0c 产品为双向透传 xff0c 只需要简单配置即可 同时产品为4G全网通 xff0c 支持国内全部运营商网络 xff0c 通讯模
  • PCB设计学习笔记(一)原理图界面

    一 画原理图库 多个引脚可以ctrl 43 c一个引脚后 xff0c 编辑 gt 设置粘贴阵列 xff0c 一次性复制出来多个引脚 二 原理图界面 生成原理图库 xff1a 在一个现成的原理图界面可以直接将现有的原理图内的原件生成一个原理图
  • novatel计算odom--GPS坐标与UTM坐标转换

    保证你的novatel的driver是在ros drivers上的驱动 1 简介 1 1 消息 gps common定义了两个通用消息 xff0c 供GPS驱动程序输出 xff1a gps common GPSFix和gps common
  • 搭建自己的slam系统

    手头有的传感器 一个vlp16线激光雷达 一个120 的fisheye相机 一整套novatel GPS 43 IMU 采集了一个闭环的bag 第一步 数据预处理 将camera的数据单独提取出来 因为没有时间戳 因此无法做到传感器的紧耦合
  • KCF_ROS + TLD_ROS 原理以及源码分析

    扩展链接 xff1a 百度搜素vot2016 xff0c 会有相关的资料 KCF缺点是有边界效应 有一个改进的版本是 xff1a SRDCF 大牛的 CSDN博客 说明 xff1a http blog csdn net app 120620
  • 数据结构+算法=程序

    xff08 1 xff09 数据结构 43 算法 61 程序 每个学计算机的人都听过这个公式 这个公式是尼克劳斯沃斯在1976年出版 算法 43 数据结构 xff1a 程序 一书中提出 尼克劳斯沃斯还是Pascal编程语言的发明人 xff0
  • librealsense源码编译-- Failed to identify Internet connection, disabling BUILD_WITH_TM2

    问题概述 xff1a 由于Realsense t265源码编译需要在CMakeList txt中将BUILD WITH TM2设置为ON xff0c 但是由于国内网络原因 xff0c 无法通过网络连接检测 xff0c 因此我通过查找文件 x
  • 内外网映射环境配置

    一 环境搭建 1 环境说明 此环境由内 外网组成 xff0c 主要实现内外网映射功能 2 环境配置图 本手册中 xff0c 内网使用78 网段 xff0c 外网使用 20 网段 外网交换机IP 地址为 192 168 20 1 3 配置路由
  • 浅析extern “C”的作用

    浅析extern C 的作用 关于extern C 的作用和意思 xff0c 网上资料已经有很多了 xff08 我也参考了几篇 xff09 xff0c 不过我还是觉得有必要自己总结一下 xff0c 毕竟 好记性不如烂笔头 嘛 到C标准函数库