使用extern "c"
主要是因為
c編譯器編譯函式時不帶引數的型別資訊,只包含函式的符號名字。如
int foo( float x )
c編譯器會將此函式編譯成類似
_foo
的符號,
c聯結器只要找到了呼叫函式的符號,就認為連線成功。
而c++
編譯器為了實現函式過載,會在編譯時帶上函式的引數資訊。如它可以把上面的函式編譯成類似於
_foo_float
這樣的符號。
所以,c
呼叫c++
,使用extern "c"
則是告訴編譯器依照
c的方式來編譯封裝介面,當然介面函式裡面的
c++語法還是按
c++方式編譯。
如:// c++ code
extern "c" int foo( int x );
int foo( int x )
這樣,編譯器會將
foo函式編譯成類似
_foo
符號,而不會編譯成類似
_foo_int
符號則c
可以這樣呼叫
c++函式
// c code
int foo( int x );
void cc( int x )
如果想呼叫過載的c++
函式,則須封裝單獨的介面共
c呼叫。
如// c++ code
void foo( int x );
void foo( float x );
extern "c" void foo_i( int x )
extern "c" void foo_f( float x )
則c中可這樣呼叫
// c code
void foo_i( int x );
void foo_f( float x );
void ccc( int x1, float x2 )
而c++呼叫c
,extern "c"
的作用是:讓
c++聯結器找呼叫函式的符號時採用
c的方式 如:
// c code
void foo( int x );
c++這樣呼叫c函式
// c++ code
extern "c" void foo( int x );
就是讓c++
聯結器能過類似於
_foo
來查詢此函式,而非類似於
_foo_int
這樣的符號。
C 和C 混合程式設計
由於歷史原因,很多時候我們的 並不完全是使用.net寫成的。這時候和以往c 的混合程式設計就顯得相當重要了。最近碰到了這樣的問題,將方法簡要記述如下。要在c 中呼叫c 函式,大體的思路是這樣的 首先將c 函式寫成dll形式的庫,然後在c 中匯入dll中的函式進行呼叫。具體的 類似這樣 c 1int ...
C 和C 混合程式設計
由於歷史原因,很多時候我們的 並不完全是使用.net寫成的。這時候和以往c 的混合程式設計就顯得相當重要了。最近碰到了這樣的問題,將方法簡要記述如下。要在c 中呼叫c 函式,大體的思路是這樣的 首先將c 函式寫成dll形式的庫,然後在c 中匯入dll中的函式進行呼叫。具體的 類似這樣 c 1 int...
C和C 混合程式設計
1 pragma once 關於 pragma once vc 及g 都支援,大膽的用吧。匯出型別必須一致.要麼是c的,要麼是c 2.cplusplus 這個是必須的 ifdef cplusplus extern c endif c 中呼叫c的 1 對於 c 中非類的成員函式,可以簡單的在函式宣告前...