使用__cplusplus实现C/C++互调
2007-10-16 18:30
519 查看
[align=left]Part A 问题:[/align]
[align=left] C/C++函数如何实现互调[/align]
[align=left] [/align]
[align=left]分析:[/align]
[align=left] 之所以C/C++函数不能直接互调是因为在C++中函数可以重载,参数检查等特性[/align]
[align=left] 如:int a(int)[/align]
[align=left] 在编译后的C代码里,函数名可能是_a[/align]
[align=left] 在编译后的C++代码里,函数名可能是a@@YAHH@Z[/align]
[align=left] (具体随编译器而定)[/align]
[align=left] [/align]
[align=left]解决办法:[/align]
[align=left] 在所需func()前面加上extern "C"[/align]
[align=left] [/align]
[align=left]原理:[/align]
[align=left] 通过extern "C"将C/C++中需要调用的函数均按照C的格式进行编译 [/align]
[align=left][/align]
[align=left]Part B 不使用__cplusplus [/align]
[align=left][/align]
[align=left]下面这个程序说明了C/C++之间的互调[/align]
[align=left]/* main.cpp */[/align]
[align=left]#include <iostream>[/align]
[align=left]using namespace std;[/align]
[align=left] [/align]
[align=left]extern "C" void funcC(void); // C++调用C[/align]
[align=left] [/align]
[align=left]int main(void) {[/align]
[align=left] funcC();[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]/* cpp.cpp */[/align]
[align=left]#include <iostream>[/align]
[align=left]using namespace std;[/align]
[align=left] [/align]
[align=left]extern "C" void funcCPP(void); // 被funcC调用[/align]
[align=left] [/align]
[align=left]void funcCPP(void) {[/align]
[align=left] cout << "Hello, C++!" << endl;[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]/* c.c */[/align]
[align=left]#include <stdio.h>[/align]
[align=left] [/align]
[align=left]extern void funcCPP(void); // C调用C++[/align]
[align=left] [/align]
[align=left]void funcC(void) {[/align]
[align=left] printf("Hello, C!/n");[/align]
funcCPP(); // 调用funcCPP
[align=left]}[/align]
[align=left]可以发现这种风格很容易出错 [/align]
[align=left][/align]
[align=left]Part C 使用__cplusplus [/align]
[align=left][/align]
[align=left]下面这个程序将要对外使用的函数放在头文件中,并对C/C++的兼容性进行声明[/align]
[align=left]/* main.cpp */[/align]
[align=left]#include <iostream>[/align]
[align=left]#include "c.h"[/align]
[align=left]using namespace std;[/align]
[align=left] [/align]
[align=left]int main(void) {[/align]
[align=left] funcC();[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]/* cpp.h */[/align]
[align=left]#ifndef __CPP_H_[/align]
[align=left]#define __CPP_H_[/align]
[align=left] [/align]
[align=left]#ifdef __cplusplus[/align]
[align=left]extern "C" {[/align]
[align=left]#endif[/align]
[align=left] void funcCPP(void);[/align]
[align=left]#ifdef __cplusplus[/align]
[align=left]}[/align]
[align=left]#endif[/align]
[align=left]#endif // __CPP_H_[/align]
[align=left] [/align]
[align=left]/* cpp.cpp */[/align]
[align=left]#include <iostream>[/align]
[align=left]#include "cpp.h"[/align]
[align=left]using namespace std;[/align]
[align=left] [/align]
[align=left]void funcCPP(void) {[/align]
[align=left] cout << "Hello, C++!" << endl;[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]/* c.h */[/align]
[align=left]#ifndef __C_H_[/align]
[align=left]#define __C_H_[/align]
[align=left] [/align]
[align=left]#ifdef __cplusplus[/align]
[align=left]extern "C" {[/align]
[align=left]#endif[/align]
[align=left] void funcC(void);[/align]
[align=left]#ifdef __cplusplus[/align]
[align=left]}[/align]
[align=left]#endif[/align]
[align=left]#endif // __C_H_[/align]
[align=left] [/align]
[align=left]/* c.c */[/align]
[align=left]#include <stdio.h>[/align]
[align=left]#include "c.h"[/align]
[align=left]#include "cpp.h"[/align]
[align=left] [/align]
[align=left]void funcC(void) {[/align]
[align=left] printf("Hello, C!/n");[/align]
[align=left] funcCPP();[/align]
[align=left]}[/align]
[align=left] C/C++函数如何实现互调[/align]
[align=left] [/align]
[align=left]分析:[/align]
[align=left] 之所以C/C++函数不能直接互调是因为在C++中函数可以重载,参数检查等特性[/align]
[align=left] 如:int a(int)[/align]
[align=left] 在编译后的C代码里,函数名可能是_a[/align]
[align=left] 在编译后的C++代码里,函数名可能是a@@YAHH@Z[/align]
[align=left] (具体随编译器而定)[/align]
[align=left] [/align]
[align=left]解决办法:[/align]
[align=left] 在所需func()前面加上extern "C"[/align]
[align=left] [/align]
[align=left]原理:[/align]
[align=left] 通过extern "C"将C/C++中需要调用的函数均按照C的格式进行编译 [/align]
[align=left][/align]
[align=left]Part B 不使用__cplusplus [/align]
[align=left][/align]
[align=left]下面这个程序说明了C/C++之间的互调[/align]
[align=left]/* main.cpp */[/align]
[align=left]#include <iostream>[/align]
[align=left]using namespace std;[/align]
[align=left] [/align]
[align=left]extern "C" void funcC(void); // C++调用C[/align]
[align=left] [/align]
[align=left]int main(void) {[/align]
[align=left] funcC();[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]/* cpp.cpp */[/align]
[align=left]#include <iostream>[/align]
[align=left]using namespace std;[/align]
[align=left] [/align]
[align=left]extern "C" void funcCPP(void); // 被funcC调用[/align]
[align=left] [/align]
[align=left]void funcCPP(void) {[/align]
[align=left] cout << "Hello, C++!" << endl;[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]/* c.c */[/align]
[align=left]#include <stdio.h>[/align]
[align=left] [/align]
[align=left]extern void funcCPP(void); // C调用C++[/align]
[align=left] [/align]
[align=left]void funcC(void) {[/align]
[align=left] printf("Hello, C!/n");[/align]
funcCPP(); // 调用funcCPP
[align=left]}[/align]
[align=left]可以发现这种风格很容易出错 [/align]
[align=left][/align]
[align=left]Part C 使用__cplusplus [/align]
[align=left][/align]
[align=left]下面这个程序将要对外使用的函数放在头文件中,并对C/C++的兼容性进行声明[/align]
[align=left]/* main.cpp */[/align]
[align=left]#include <iostream>[/align]
[align=left]#include "c.h"[/align]
[align=left]using namespace std;[/align]
[align=left] [/align]
[align=left]int main(void) {[/align]
[align=left] funcC();[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]/* cpp.h */[/align]
[align=left]#ifndef __CPP_H_[/align]
[align=left]#define __CPP_H_[/align]
[align=left] [/align]
[align=left]#ifdef __cplusplus[/align]
[align=left]extern "C" {[/align]
[align=left]#endif[/align]
[align=left] void funcCPP(void);[/align]
[align=left]#ifdef __cplusplus[/align]
[align=left]}[/align]
[align=left]#endif[/align]
[align=left]#endif // __CPP_H_[/align]
[align=left] [/align]
[align=left]/* cpp.cpp */[/align]
[align=left]#include <iostream>[/align]
[align=left]#include "cpp.h"[/align]
[align=left]using namespace std;[/align]
[align=left] [/align]
[align=left]void funcCPP(void) {[/align]
[align=left] cout << "Hello, C++!" << endl;[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]/* c.h */[/align]
[align=left]#ifndef __C_H_[/align]
[align=left]#define __C_H_[/align]
[align=left] [/align]
[align=left]#ifdef __cplusplus[/align]
[align=left]extern "C" {[/align]
[align=left]#endif[/align]
[align=left] void funcC(void);[/align]
[align=left]#ifdef __cplusplus[/align]
[align=left]}[/align]
[align=left]#endif[/align]
[align=left]#endif // __C_H_[/align]
[align=left] [/align]
[align=left]/* c.c */[/align]
[align=left]#include <stdio.h>[/align]
[align=left]#include "c.h"[/align]
[align=left]#include "cpp.h"[/align]
[align=left] [/align]
[align=left]void funcC(void) {[/align]
[align=left] printf("Hello, C!/n");[/align]
[align=left] funcCPP();[/align]
[align=left]}[/align]
相关文章推荐
- 使用#ifdef _cplusplus 实现c 和 c++的混合编程
- C++ 使用STL string 实现的split,trim,replace
- 如何使用C\C++实现文件的检索&nbsp;?
- matlab2c使用c++实现matlab函数系列教程-binostat函数
- 快速傅里叶变换,使用C++ STL Complex 实现
- 使用boost实现c++与python的相互调用
- 使用tolua++实现C++与LUA相互调用
- cocosdx交叉编译到android使用jni实现java端调用C++方法
- cocos2dx 使用jni实现java调用c++
- 局域网象棋游戏(C++实现,使用Socket,界面使用Win32,CodeBlocks+GCC编译)
- 进程通信之一 使用WM_COPYDATA C++及C#实现
- 【C++ STL应用与实现】18: 如何使用迭代器适配器
- 简单的加密与解密的实现---仿射密码(c++使用string)
- c++ 使用int main(int argc,char* argv[])实现文件批处理
- 使用c++实现一个FTP客户端(三)
- matlab2c使用c++实现matlab函数系列教程-mean函数
- 使用C++实现simplex算法
- matlab2c使用c++实现matlab函数系列教程-sort函数
- 使用C++实现JNI接口需要注意的事项
- 2叉树遍历的递归实现-使用c++模板