最近工作不算轻松,现在作为一个项目的负责人统一管理着前端、后端、设计、产品,身上肩负着不小责任,虽然有压力但是对于自己也是一种锻炼。同时自己也在负责整个后端的架构设计,虽然后端经验不是很多,但是自己正是发挥优点的时候。

回到正题,在Android NDK开发的时候,我们会遇到extern "C"这个关键字,我们写JNI函数的时候都会加上这个。那么这个关键字到底有什么作用呢?

C与C++对函数的处理:

其实编译器对于C与C++文件的处理是不一样的,我们使用编译器(GCC)对于C来说,生成的目标文件中函数的签名就是和原来函数一样(_函数名)。而对于C++来说,生成的目标文件中的函数的签名是和原来的不一样,会在后面添加额外的字符(_函数名_int_int,根据参数个数和类型在后头追加字符)。

如果直接将两个目标文件,通过连接器链接一起,如果C++文件引入了C的头文件,则会报错找不到指定的函数。因为编译器对于C++中引入的C头文件,引入的声明函数是以C++方式处理生成目标文件,函数名称也是以C++方式处理。所以在链接器进行链接的时候,C的目标文件中函数就是函数名称,而C++的目标文件中,函数已经名称变了,自然会报错。

所以为了解决C++中使用C库文件的问题,就有了extern "C"关键字,他表示将使用C的方式处理函数名,当编译C++文件中带有此关键字的函数或者变量时,生成的目标文件中的函数名是按照C的方式。所以就能将C++和C的库兼容一起,实现C++调用C的库。

其他笔记记录

__cplusplus是一个C++预定义的值,通常和extern "C"关键字一起使用:
// __cplusplus是某一个被定义的值

// C++03
__cplusplus = 199711L
// C++11
__cplusplus = 201103L

// 所以编译是否使用C++11,可以进行如下判断:
#if __cplusplus < 201103L
    #error “Should use –std=c++11 option for compile
#endif

// extern “C”可以抑制C++对函数名、变量名进行名称重整,故编译出的C目标文件和C++目标文件名的函数名、变量名都是相同的,链接器能可靠地对两种类型的目标文件进行链接。

#ifdef __cplusplus
extern "C" {
#endif

// 任何变量声明,函数声明。

#ifdef __cplusplus
}
#endif

  

【编程语言】extern "C"让C++与C进行混合编程的更多相关文章

  1. C和C++混合编程中的extern "C" {}

    引言 在用C++的项目源码中,经常会不可避免的会看到下面的代码: 1 2 3 4 5 6 7 8 9 #ifdef __cplusplus extern "C" { #endif ...

  2. [收藏转贴]struct探索·extern "C"含义探索 ·C++与C的混合编程·C 语言高效编程的几招

    一.C/C++语言 struct深层探索 1.自然对界 struct是一种复合数据类型,其构成元素既可以是基本数据类型(如 int.long.float等)的变量,也可以是一些复合数据类型(如 arr ...

  3. 【C/C++】struct探索·extern "C"含义探索 ·C++与C的混合编程·C 语言高效编程的几招

    本文为笔者阅读<嵌入式C精华>的摘录,推荐一下,不错的书 一.C/C++语言 struct深层探索 1.自然对界 struct是一种复合数据类型,其构成元素既可以是基本数据类型(如 int ...

  4. extern &quot;C&quot; 的含义:实现C++与C及其他语言的混合编程

    C++中extern "C"的设立动机是实现C++与C及其他语言的混合编程.        C++为了支持函数的重载,C++对全局函数的处理方式与C有明显的不同.对于函数void ...

  5. extern的使用详解(多文件编程)——C语言

    extern——关键字 extern是C语言中的一个关键字,一般用在变量名前或函数名前,作用是用来说明“此变量/函数是在别处定义的,要在此处引用”,extern这个关键字大部分读者应该是在变量的存储类 ...

  6. C++常考面试题汇总

    c++面试题 一 用简洁的语言描述 c++ 在 c 语言的基础上开发的一种面向对象编程的语言: 应用广泛: 支持多种编程范式,面向对象编程,泛型编程,和过程化编程:广泛应用于系统开发,引擎开发:支持类 ...

  7. iOS开发路线简述

    1 iOS开发环境1.1 开发环境标准的配置是MacOSX+Xcode.MacOSX的话首选用苹果电脑,Macmini最便宜只要4000多就好了然后自己配一个显示器,MacBookPro 也可以,不推 ...

  8. 函数定义从零开始学C++之从C到C++(一):const与#define、结构体对齐、函数重载name mangling、new/delete 等

    今天一直在学习函数定义之类的问题,下午正好有机会和大家共享一下. 一.bool 类型 逻辑型也称布尔型,其取值为true(逻辑真)和false(逻辑假),存储字节数在不同编译系统中可能有所不同,VC+ ...

  9. 【转】iOS开发路线简述

    简单看了下楼主说的很详细,尤其是最后面那个图描述很直观,让想学习ISO开发的程序猿很清晰每个步骤学习的内容,在此收藏下. iOS系统以及iPhone的出来都要感谢乔布斯,一个完美主义者,从如此优秀的i ...

随机推荐

  1. 2018-2019-2 网络对抗技术 20165321 Exp5 MSF基础应用

    1. 实践内容(3.5分) 1.1一个主动攻击实践: (1分) 首先攻击Windows XP: 在攻击机kali输入msfconsole进入控制台,依次输入以下指令: msf > use exp ...

  2. JavaScript实现RSA加解密

    在GitHub上找到jsencrypt.js对RSA加解密的工具文件,地址分别是:https://github.com/travist/jsencrypt和https://github.com/ope ...

  3. JS 获取最近(前)7天(一周内)和最近(前)3天日期

    //获取最近7天日期 getDay(0);//当天日期 getDay(-7);//7天前日期 //获取最近3天日期 getDay(0);//当天日期 getDay(-3);//3天前日期 functi ...

  4. mysql导入本地文件(作业)

    1.准备本地文件(pet.txt) 2.在CMD中启动mysql服务,然后输入以下命令导入(pet.txt) load data local infile '路劲' into table pet; 3 ...

  5. C#调用java方法踩坑记

    首先,我的java代码写了一个遗传算法,这是我硕士毕业论文的核心算法,项目是基于C#的web项目.但是现在又不想用C#重写遗传算法代码,于是就想用C#去调用java的代码.在网上找了方法,一般有两种: ...

  6. Excel坐标自动在AutoCad绘图_5

    众所周知,Excel对数据处理的功能非常强大,它可以进行数据处理.统计分析已经辅助决策的操作,该软件已经渗透到各个领域.作为一个测绘人,GISer, 也经常利用excel完成一些测量表格的自动化计算, ...

  7. 搭建本地yum仓库(centos 7.5)

    1. 保留下载的软件包 [root@zabbix-server01 ~]# vim /etc/yum.conf keepcache=1 #开启后下载的软件都会保存到本地 2.将软件进行下载,并将所有r ...

  8. TTL集成门电路

    一.TTL集成门电路的结构1.总体结构 所谓TTL就是transistor transistor logic,就是说是由晶体管和晶体管之间构成电路. 2.    TTL集成门电路典型输入级形式 1)二 ...

  9. HashMap 和 Hashtable 的 6 个区别,一般人不知道最后一条

    1.线程安全 Hashtable 是线程安全的,HashMap 不是线程安全的. 为什么说 HashTable 是线程安全的? 来看下 Hashtable 的源码,Hashtable 所有的元素操作都 ...

  10. linux下的CPU、内存、IO、网络的压力测试

    linux下的CPU.内存.IO.网络的压力测试  要远程测试其实很简单了,把结果放到一个微服务里直接在web里查看就可以了,或者同步到其他服务器上 一.对CPU进行简单测试: 1.通过bc命令计算特 ...