您的位置:首页 > 编程语言 > C语言/C++

使用__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]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  iostream c++ c 编译器