C代码中如何调用C++ C++中如何调用C
注意這里的C調(diào)用C++或者C++調(diào)用C意思是.c文件中調(diào)用.cpp文件中代碼,或者相反。
集成開發(fā)環(huán)境如VC++6.0或者vs都是以文件后綴來區(qū)別當(dāng)前要編譯的是C代碼還是C++代碼,然后采用響應(yīng)的編譯、調(diào)用協(xié)議等。
使用extern "C" 主要是因?yàn)镃編譯器編譯函數(shù)時(shí)不帶參數(shù)的類型信息,只包含函數(shù)的符號名字。如?
int foo( float x )
C編譯器會將此函數(shù)編譯成類似_foo的符號,C連接器只要找到了調(diào)用函數(shù)的符號,就認(rèn)為連接成功。
而C++編譯器為了實(shí)現(xiàn)函數(shù)重載,會在編譯時(shí)帶上函數(shù)的參數(shù)信息。如它可以把上面的函數(shù)編譯成類似于_foo_float這樣的符號。
所以,C調(diào)用C++,使用extern "C"則是告訴編譯器依照C的方式來編譯封裝接口,當(dāng)然接口函數(shù)里面的C++語法還是按C++方式編譯。
如:1 普通函數(shù)
// C++ Code
extern "C" int foo( int x );
int foo( int x )
{
?? //...
}
這樣,編譯器會將foo函數(shù)編譯成類似_foo符號,而不會編譯成類似_foo_int符號
則C可以這樣調(diào)用C++函數(shù)
// C Code
int foo( int x );
void cc( int x )
{
??? foo( x );
??? //...
}
2 如果想調(diào)用重載的C++函數(shù),則須封裝單獨(dú)的接口共C調(diào)用。
如
// C++ Code
void foo( int x );
void foo( float x );
extern "C" void foo_i( int x )
{
??? foo( x );
}
extern "C" void foo_f( float x )
{
??? foo( x );
}
則C中可這樣調(diào)用
// C Code
void foo_i( int x );
void foo_f( float x );
void ccc( int x1, float x2 )
{
??? foo_i( x1 );
??? foo_f( x2 );
??? // ...
}?
3 C中想調(diào)用C++中的成員函數(shù)(包括虛函數(shù)),則需要提供一個(gè)簡單的包裝(wrapper)。
例如: // C++ code:
class C
{
? ...
? virtual double f(int);
};
extern "C" double call_C_f(C* p, int i) // wrapper function
{
return p->f(i);
}
然后,你就可以這樣調(diào)用 C::f():
//C code
double call_C_f(struct C* p, int i);//聲明
void ccc(struct C* p, int i)
{
?? double d=call_C_f(p,i);
?...
}
問題:參數(shù)struct C* p從哪里來,即怎么在C中定義C++對象,其實(shí)上面只是說了思想,真實(shí)的c中使用C++類需要把原來的類都封裝一下,參看下面的文章
http://blog.csdn.net/caspiansea/article/details/9676153
而C++調(diào)用C,extern "C" 的作用是:讓C++連接器找調(diào)用函數(shù)的符號時(shí)采用C的方式?如:
// C Code
void foo( int x );
C++這樣調(diào)用C函數(shù)
// C++ Code
extern "C" void foo( int x );
就是讓C++連接器能過類似于_foo來查找此函數(shù),而非類似于_foo_int這樣的符號。
?
時(shí)常在cpp的代碼之中看到這樣的代碼: 特別是C ++中引入C的頭文件,這些C頭文件中出現(xiàn)很多如下代碼。
#ifdef __cplusplus extern "C" { #endif
//一段代碼
#ifdef __cplusplus } #endif?
其中__cplusplus是C++編譯器的保留宏定義.就是說C++編譯器認(rèn)為這個(gè)宏已經(jīng)定義了. 所以關(guān)鍵是extern "C" {} extern "C"是告訴C++編譯器件括號里的東東是按照C的obj文件格式編譯的,要連接的話按照C的命名規(guī)則去找.要明白為何使用extern "C",還得從cpp中對函數(shù)的重載處理開始說起。在c++中,為了支持重載機(jī)制,在編譯生成的匯編碼中,要對函數(shù)的名字進(jìn)行一些處理,加入比如函數(shù)的返回類型等等.而在C中,只是簡單的函數(shù)名字而已,不會加入其他的信息.也就是說:C++和C對產(chǎn)生的函數(shù)名字的處理是不一樣的.
明白了加入與不加入extern "C"之后對函數(shù)名稱產(chǎn)生的影響,我們繼續(xù)我們的討論:為什么需要使用extern "C"呢?C++之父在設(shè)計(jì)C++之時(shí),考慮到當(dāng)時(shí)已經(jīng)存在了大量的C代碼,為了支持原來的C代碼和已經(jīng)寫好C庫,需要在C++中盡可能的支持C,而extern "C"就是其中的一個(gè)策略。
試想這樣的情況:一個(gè)庫文件已經(jīng)用C寫好了而且運(yùn)行得很良好,這個(gè)時(shí)候我們需要使用這個(gè)庫文件,但是我們需要使用C++來寫這個(gè)新的代碼。如果這個(gè)代碼使用的是C++的方式鏈接這個(gè)C庫文件的話,那么就會出現(xiàn)鏈接錯誤.
現(xiàn)在我們有了一個(gè)C庫文件,它的頭文件是f.h,產(chǎn)生的lib文件是f.lib,那么我們?nèi)绻贑++中使用這個(gè)庫文件,我們需要這樣寫:
extern "C" {
#include "f.h"
}
總結(jié)
以上是生活随笔為你收集整理的C代码中如何调用C++ C++中如何调用C的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 项目管理中的特殊———例外管理
- 下一篇: c++中enum 如何使用