extern在C和C 混合程式設計中呼叫注意

2021-06-17 01:10:54 字數 1292 閱讀 7385

使用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 中非類的成員函式,可以簡單的在函式宣告前...