C與C++的相互調用

    在實際工作中可能經常要進行C和C++的混合編程,C++調用C語言的代碼通常都比較容易,但也有一些細節需要注意。C要調用C++的代碼就略爲麻煩一些,因爲C不支持面向對象的特徵。
首先我們來看一下C++調用C語言的代碼。要讓你的C代碼既能被C代碼又能被C++調用雖說容易,但是還是有需要注意的地方。現有三個文件分別如下:
/* 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是其實現文件,file TestCpp.cpp是調用C函數的C++文件。
文件TestC.h中的TESTC_H定義是爲了頭文件保護,” #ifdef __cplusplus”這個不能缺少,你可以去查看C的標準庫頭文件中都有這個,如”stdio.h”。有了這個宏編譯器就知道現在是C還是C++在調用它。
爲什麼要區分C與C++調用呢?其深層次原因是因爲C和C++編譯器在編譯和鏈接時對於函數的處理不一樣。C++爲了支持函數重載在編譯時會加入函數參數及類型信息。如上面的add方法,C編譯器編譯後在符號庫中的名字爲_add,而C++編譯器則會產生像_add_int_int之類的名字。C++正是依靠這種機制實現了函數的重載。
extern關鍵字表示將函數或變量聲明爲全局類型,與之相對應的是static。static限定函數或變量的作用域爲本文件。extern還有一個作用就是與”C”連在一起使用,即extern “C”通知編譯器將extern “C”所包含的代碼按照C的方式編譯和鏈接。
 
下面我們就來看看如何在C語言中使用C++的代碼(包括C++類的方法)。自定義類文件(這裏省略了頭文件保護等其它細節)如下:
//* file TestClass.h */
 
class HJH
{
public:
    int add(int a, int b);
};
 
//* file TestClass.cpp */
 #include "TestClass.h"

int HJH::add(int a, int b)
{
return (a + b);
}

將C++類封裝爲C函數的文件如下:
/* file TestCpp.h */
 
#ifndef  _TESTCPP_H_
#define  _TESTCPP_H_

#ifdef __cplusplus
extern "C" {
#endif

// 函數以C的方式編譯
int add_cpp(int a, int b);

#ifdef __cplusplus
}
#endif


#endif


/* file TestCpp.cpp */
 #include "TestCpp.h"
#include "TestClass.h"

int add_cpp(int a, int b)
{
       HJH hjh;
 
       return hjh.add(a, b);      
}
 
實際調用C++代碼的C文件如下:
/*file TestC.c */
#include "stdio.h"
 #include "TestCpp.h"
int main()
{
       printf("add_cpp = %d/n", add_cpp(2, 5));

       return 0;
}
上面的過程很清晰,就是用一個函數將C++類的使用封裝起來,然後將它外部聲明爲C函數就可以了。
文件TestClass.h定義並實現了一個類,該類只有一個add方法。文件TestCpp.cpp定義並實現了一個函數add_cpp,函數中定義了一個HJH類對象並調用了該對象的add方法。然後將add_cpp函數進行外部聲明爲C。
TestC.c文件中爲了使用add_cpp函數,也需要進行外部聲明。這是爲了通知編譯器說明這個函數是在其他文件中實現(注意在C文件中的extern後面不可加”C”)。當這三個文件一起編譯鏈接時,編譯器就可以找到add_cpp的具體實現。
測試代碼參考:http://download.csdn.net/detail/leichelle/9914690
發佈了90 篇原創文章 · 獲贊 255 · 訪問量 169萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章