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

来源:互联网 发布:ipad图片编辑软件 编辑:程序博客网 时间:2024/06/05 05:34

**其实在网上关于这个问题已经讨论很多了,但是大多都是重复的,确实讲解的很详细,还指出了怎么用是错误的,本来记忆就不怎么样,所以对于记忆这些错误的用法更是讨厌,还不如记忆一种通用的而且比较规范、代码阅读起来比较舒适的方法,下面我们开始吧!!!
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_Hextern "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  __cplusplusextern "C" {#endifint add( int x, int y );#ifdef __cplusplus}#endif#endife "cExample.h" //就不会报错了.  //无论写 c 还是 c++头文件,只要是想以后混合编程,就最好加上#ifdef  __cplusplusextern "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();    }}
1 0
原创粉丝点击