C/C++混合编程--extern “C” 使用方法详解

**其实在网上关于这个问题已经讨论很多了,但是大多都是重复的,确实讲解的很详细,还指出了怎么用是错误的,本来记忆就不怎么样,所以对于记忆这些错误的用法更是讨厌,还不如记忆一种通用的而且比较规范、代码阅读起来比较舒适的方法,下面我们开始吧!!!
C、C++密不可分,平时使用更多的是C,但有时候却少不了C++,而且是C、C++混搭(混合编程)在一起的,比如,RTP视频传输,live555多媒体播放等都是C++下的,他需要调用JRTPLIB库,再比如,我那邮件发送,我也用C++写的,定义了一个Email对象,包含了成员:收发邮件地址,用户名,密码等,以及方法:邮件头、Base64编码和邮件发送这些操作,很好用,所以,很多时候,C++还是蛮不错的。。。。但,.c与.cpp文件混搭在一起,不是那么的简单**

这里写图片描述

二、extern“C”与__cplusplus

#ifdef __cplusplus
       extern "C" {
       #endif

       #ifdef __cplusplus
       }
       #endif
   Cplusplus(C plus plus)即"C++",用于C++文档的头文件中,上面代码的意思是:如果是C++文件(*.cpp)后缀,则使用extern “C”,在C++项目中应用的非常广泛。即使用gcc编译器编译,函数名为C类型如_foo。个人认为,搞懂了这两个关键字,尤其是理解extern "C" 

三extern “C” 是为了C与C++混合编程而设立的关键字,假如你已经知道了关于extern “C” 的一些使用方法,想很快掌握使用策略

    1)在C++程序中调用C程序,比如在CPP文件中使用C文件的某一个函数,那么可以肯定的是所使用的函数肯定是按照C语言的编译方式编译,那么仅仅通告CPP文件按照C语言调用函数的方式调用即可,而且不用再重新编译C函数,在函数所在头文件中添加extern "C"关键字,将这个头文件包含到CPP文件即可。
  2)在C程序中使用CPP编译的函数,这样需要重新编译函数库,在函数声明的头文件中也是如上声明,然后再函数所在的CPP文件添加上述头文件,直接编译即可,这个时候虽说在CPP文件编译,但是是安装C语言的方式编译,在C文件中同样添加上述头文件即可。

但是在使用的时候也是有一定的规//C++头文件 cppExample.h

#ifndef CPP_EXAMPLE_H
#define CPP_EXAMPLE_H
extern "C" int add( int x, int y );
#en//C++实现文件 cppExample.cpp
#include "cppExample.h"
int add( int x, int y )
{
return x + y;
}

/* C实现文件 cFile.c
/* 这样会编译出错:#include "cExample.h" */
extern int add( int x, int y );
int main( int argc, char* argv[] )
{
add( 2, 3 ); 
return 0;
}
#ifndef CPP_EXAMPLE_H
#define CPP_EXAMPLE_H

#ifdef  __cplusplus
extern "C" {
#endif

int add( int x, int y );
#ifdef __cplusplus
}
#endif

#endife "cExample.h" 
//就不会报错了.
  //无论写 c 还是 c++头文件,只要是想以后混合编程,就最好加上

#ifdef  __cplusplus
extern "C" {
#endif

/**** some declaration or so *****/

#ifdef  __cplusplus
    }
#endif  /* end of __cplusplus */

错误的原因在于在C语言中没有关键字 extern “C”
(PS:有的人会单独使用extern “C” 来修饰某个函数,我觉得不是很好看,特别是在头文件中不能这么使用,因为在C文件中不能出现这样的关键字,所以最好使用最后介绍的条件编译 在一定条件下才使用 extern “C”)

本人在程序看到的是直接定义,如下代码。
可能其他编译的含义,理解可再来添加
本人装载:
http://blog.csdn.net/yusiguyuan/article/details/23128943

extern "C" void c_plus_plus_releaseWakeLock();


void c_plus_plus_releaseWakeLock() 
{
    if (gWakeLockToken != 0) {
        ALOGV("releaseWakeLock_l() %s", ANDROID_WAKE_LOCK_NAME);
        if (gPowerManager != 0) {
            gPowerManager->releaseWakeLock(gWakeLockToken, 0);
        }
        gWakeLockToken.clear();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值