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

回到正题,在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. 关于delete请求,后台接收不到数据

    在前端用axios需要这样写 /** * 删除数据 */export function del(url, data = {}) { return axios.delete(url, { data: q ...

  2. Cocos2dx Android环境编译出错:jni/Android.mk: Cannot find module with tag 'scripting/lua-bindings' in import path

    解决方案为: 在项目proj.android\jni\Android.mk(D:\my_lua_test2\MyluaTest\frameworks\runtime-src\proj.android\ ...

  3. newcode网学习笔记(1)

    1.类的内存结构一开始指向的是虚函数表,指向虚函数表的指针为4个字节(32位系统)[类的内存结构最前面的是指向虚函数表的指针] 2.包含标准库文件以及相关命名空间,则系统不允许用户重新定义标准库函数, ...

  4. arcgis for JavaScript API 4.5与4.3的区别

    arcgis 4.5与4.3区别: 鉴于本人使用4.3时间比较久,而arcgis for JavaScript API于9月28日推出了4.5版本,但是直接更换4.5的init.js会出现意想不到的错 ...

  5. flask error

    from flask import Flaskfrom flask import abort app = Flask(__name__) @app.route('/')def index(): ret ...

  6. Ubuntu Win10双系统重启ubuntu出现黑屏情况 Ubuntu引导修复

    step 1 : 准备一个Ubuntu grub启动盘 step 2 : 进入Ubuntu启动盘的 Try Ubuntu without install step 3 : 使用终端输入以下命令,记住检 ...

  7. eclipse发布到tomcat

    1.用maven集成的工程,在发布的时候,发现其中的变量没有改变,类似${}不存在之类 解决方式:这个类问题是由于缓存导致,基本方法就是clean一下,重启eclipse,最后不行重启电脑 2.今天遇 ...

  8. C++ this指针的详解

    C++中this指针的用法详解   转自:http://blog.chinaunix.net/uid-21411227-id-1826942.html 1. this指针的用处: 一个对象的this指 ...

  9. Redis连接池

    package com.lee.utils; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; impor ...

  10. 多线程threading 的使用

    在Python3中,通过threading模块提供线程的功能.原来的thread模块已废弃.但是threading模块中有个Thread类(大写的T,类名),是模块中最主要的线程类,一定要分清楚了,千 ...