在實(shí)際工作中可能經(jīng)常要進(jìn)行C和C++的混合編程,C++調(diào)用C語言的代碼通常都比較容易,但也有一些細(xì)節(jié)需要注意。C要調(diào)用C++的代碼就略為麻煩一些,因?yàn)镃不支持面向?qū)ο蟮奶卣鳌?br />首先我們來看一下C++調(diào)用C語言的代碼。要讓你的C代碼既能被C代碼又能被C++調(diào)用雖說容易,但是還是有需要注意的地方。現(xiàn)有三個(gè)文件分別如下:
/* file TestC.h */
#ifndef TESTC_H
#define TESTC_H
#ifdef __cplusplus
extern "C" {
#endif
int add(int a, int b);
#ifdef __cplusplus
}
#endif
#endif /* TESTC_H */
/* file TestC.c */
#include "TestC.h"
int add(int a, int b)
{
return (a + b);
}
/* file TestCpp.cpp */
#include "stdio.h"
#include "TestC.h"
int main()
{
printf("add = %d\n", add(2, 5));
return 0;
}
說明:
file TestC.h是C的頭文件,file TestC.c是其實(shí)現(xiàn)文件,file TestCpp.cpp是調(diào)用C函數(shù)的C++文件。
文件TestC.h中的TESTC_H定義是為了頭文件保護(hù),” #ifdef __cplusplus”這個(gè)不能缺少,你可以去查看C的標(biāo)準(zhǔn)庫頭文件中都有這個(gè),如”stdio.h”。有了這個(gè)宏編譯器就知道現(xiàn)在是C還是C++在調(diào)用它。
為什么要區(qū)分C與C++調(diào)用呢?其深層次原因是因?yàn)镃和C++編譯器在編譯和鏈接時(shí)對于函數(shù)的處理不一樣。C++為了支持函數(shù)重載在編譯時(shí)會(huì)加入函數(shù)參數(shù)及類型信息。如上面的add方法,C編譯器編譯后在符號庫中的名字為_add,而C++編譯器則會(huì)產(chǎn)生像_add_int_int之類的名字。C++正是依靠這種機(jī)制實(shí)現(xiàn)了函數(shù)的重載。
extern關(guān)鍵字表示將函數(shù)或變量聲明為全局類型,與之相對應(yīng)的是static。static限定函數(shù)或變量的作用域?yàn)楸疚募?。extern還有一個(gè)作用就是與”C”連在一起使用,即extern “C”通知編譯器將extern “C”所包含的代碼按照C的方式編譯和鏈接。
下面我們就來看看如何在C語言中使用C++的代碼(包括C++類的方法)。為了簡單起見,我將類的定義和實(shí)現(xiàn)放在一個(gè)文件中(通常應(yīng)該是將分別放在.h和.cpp文件中)。自定義類文件(這里省略了頭文件保護(hù)等其它細(xì)節(jié))如下:
//* file TestClass.h */
class HJH
{
public:
int add(int a, int b)
{
return (a + b);
}
};
將C++類封裝為C函數(shù)的文件(為了簡略也將聲明和實(shí)現(xiàn)放在了同一個(gè)文件中)如下:
/* file TestCpp.cpp */
#include "TestClass.h"
extern "C" int add_cpp(int a, int b);
int add_cpp(int a, int b)
{
HJH hjh;
return hjh.add(a, b);
}
實(shí)際調(diào)用C++代碼的C文件如下:
/*file TestC.c */
#include "stdio.h"
extern int add_cpp(int a, int b);
int main()
{
printf("add_cpp = %d\n", add_cpp(2, 5));
return 0;
}
上面的過程很清晰,就是用一個(gè)函數(shù)將C++類的使用封裝起來,然后將它外部聲明為C函數(shù)就可以了。
文件TestClass.h定義并實(shí)現(xiàn)了一個(gè)類,該類只有一個(gè)add方法。文件TestCpp.cpp定義并實(shí)現(xiàn)了一個(gè)函數(shù)add_cpp,函數(shù)中定義了一個(gè)HJH類對象并調(diào)用了該對象的add方法。然后將add_cpp函數(shù)進(jìn)行外部聲明為C。
TestC.c文件中為了使用add_cpp函數(shù),也需要進(jìn)行外部聲明。這是為了通知編譯器說明這個(gè)函數(shù)是在其他文件中實(shí)現(xiàn)(注意在C文件中的extern后面不可加”C”)。當(dāng)這三個(gè)文件一起編譯鏈接時(shí),編譯器就可以找到add_cpp的具體實(shí)現(xiàn)。
本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/gobitan/archive/2007/03/18/1532769.aspx