C/C++混合编程--extern “C” 使用方法详解
2016-08-26 16:55
316 查看
**其实在网上关于这个问题已经讨论很多了,但是大多都是重复的,确实讲解的很详细,还指出了怎么用是错误的,本来记忆就不怎么样,所以对于记忆这些错误的用法更是讨厌,还不如记忆一种通用的而且比较规范、代码阅读起来比较舒适的方法,下面我们开始吧!!!
C、C++密不可分,平时使用更多的是C,但有时候却少不了C++,而且是C、C++混搭(混合编程)在一起的,比如,RTP视频传输,live555多媒体播放等都是C++下的,他需要调用JRTPLIB库,再比如,我那邮件发送,我也用C++写的,定义了一个Email对象,包含了成员:收发邮件地址,用户名,密码等,以及方法:邮件头、Base64编码和邮件发送这些操作,很好用,所以,很多时候,C++还是蛮不错的。。。。但,.c与.cpp文件混搭在一起,不是那么的简单**
二、extern“C”与__cplusplus
三extern “C” 是为了C与C++混合编程而设立的关键字,假如你已经知道了关于extern “C” 的一些使用方法,想很快掌握使用策略
但是在使用的时候也是有一定的规//C++头文件 cppExample.h
错误的原因在于在C语言中没有关键字 extern “C”
(PS:有的人会单独使用extern “C” 来修饰某个函数,我觉得不是很好看,特别是在头文件中不能这么使用,因为在C文件中不能出现这样的关键字,所以最好使用最后介绍的条件编译 在一定条件下才使用 extern “C”)
本人在程序看到的是直接定义,如下代码。
可能其他编译的含义,理解可再来添加
本人装载:
http://blog.csdn.net/yusiguyuan/article/details/23128943
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(); } }
相关文章推荐
- C/C++混合编程--extern “C” 使用方法详解
- C/C++ 关键字的使用方法详解
- C/C++混合编程之extern “C”的使用示例
- C/C++中libcurl的使用-Http GET方法使用详解
- 使用C++实现全排列算法的方法详解
- 详解C++的JSON静态链接库JsonCpp的使用方法
- Android使用jni调用c++/c方法详解
- C语言vector的使用方法 C++中vector的用法详解
- c++ vector(向量)使用方法详解(顺序访问vector的多种方式)
- C/C++语言extern使用方法总结
- C/C++语言extern使用方法总结
- C++ 中RTTI的使用方法详解
- C/C++语言extern使用方法总结.doc
- c++ vector(向量)使用方法详解(顺序访问vector的多种方式)
- extern和extern“c"作用详解 以及C和C++混合编程 在文章:3.深层揭密extern "C" 部分可以看到 .
- Windows,C/C++_字符串转换_MultiByteToWideChar和WideCharToMultiByte的正确使用方法及参数详解
- C++中new和delete的使用方法详解
- C++中BitBlt的使用方法详解
- C++ 命名空间-namespace作用与使用方法详解
- c++ vector(向量)使用方法详解(顺序访问vector的多种方式)