C 和C相互呼叫 extern C 的使用

2021-08-27 05:24:48 字數 1925 閱讀 7631

一、c++呼叫c

實際工程中c++和c**相互呼叫是不可避免的

1.c++編譯器能夠相容c語言的編譯方式

2.c++編譯器會優先使用c++編譯的方式

3.extern關鍵字能強制讓c++編譯器進行c方式的編譯

語法:

extern "c"

example:

c語言檔案 add.c  :

#include "add.h"

int add(int a, int b)

c++檔案  main.h:

int add(int a, int b);
c++檔案  main.cpp:

#include extern  "c"   //標頭檔案中的**為c**,所以必須用c方式編譯。 

int add(int a, int b)

extern "c"在c++中有乙個函式名,它有「c」鏈結(編譯器不會mangle 這個函式名),這樣client c**就可以鏈結到你的函式使用乙個「c」相容的標頭檔案,它只包含你的函式的宣告。你的函式定義包含在乙個二進位制格式(由你的c++編譯器編譯),client c'鏈結器將會鏈結到使用'c'的名稱。

由於c ++有函式名稱的過載而c沒有,因此c ++編譯器不能只使用函式名作為鏈結的唯一id,因此它通過新增有關引數的資訊來mangle 函式名。 ac編譯器不需要破壞名稱,因為您不能在c中過載函式名。當您宣告函式在c ++中具有extern「c」鏈結時,c ++編譯器不會將引數/引數型別資訊新增到用於函式名的連線。

extern "c" void foo(int);

extern "c"

如果你比較 關心技術方面的問題,它們列在c++03標準的第7部分中,這裡有乙個簡短的總結(強調extern 「c」):

1.extern 「c」是乙個鏈結規範

2.每個編譯器都需要提供「c」鏈結

3.鏈結規範只在命名空間範圍內發生

4.只有函式名和帶有外部鏈結的變數名具有語言鏈結

5.具有不同語言連線的兩個函式型別是不同的型別,即使在其他情況下是相同的

6.鏈結規範nest,內部決定了最終的鏈結

7.對於類成員來說,外部的「c」是被忽略的

8.在大多數帶有特定名稱的函式中,可以有「c」鏈結(不管命名空間)

9.'static' inside 'extern "c"'「是有效的;乙個被宣告的實體有內部鏈結,因此沒有語言鏈結

10.從c++到其他語言中定義的物件,以及從其他語言中定義的物件,都是由實現定義和依賴於語言的。只有當兩種語言實現的物件布局策略足夠相似時,才可以實現這樣的鏈結

二、如何使c語言**既能在c編譯中通過,又能在c++編譯中通過?

語法:

#ifdef __cplusplus

extern "c"

#endif

這樣做的目的是讓您可以使用c++**使用c標頭檔案,因為將定義巨集「cplusplus」。但是您仍然可以在遺留c**中使用它,在那裡沒有定義巨集,所以它不會看到唯一的c++結構。

test:

#include #ifndef __cplusplus //如果沒有定義巨集

extern "c" //保留extern "c"

//保留括號 }

#endif

int add(int a, int b)

《全文完》

C和C 相互呼叫

c和c 相互呼叫 2011 11 01 18 42 29 分類 c c 在專案中融合c和c 有時是不可避免的,在呼叫對方的功能函式的時候,或許會出現這樣那樣的問題。近來在主程式是c語言,而呼叫c 功能函式的時候,c 的 h標頭檔案都能找到,功能函式也都定義了,最重要的是,單獨編譯c 的時候完全沒有問...

C 和C的相互呼叫

在c專案中融合c 和c的 是實際工程中不可避免的,就如一般底層的驅動是用c寫的,而應用層一般會用c c 的編譯器能相容c語言的編譯器,但他優先以c 的方式編譯 extern關鍵字強制讓c 編譯器對 進行c方式編譯注意 cplusplus 是c 編譯器都內建的乙個巨集,可以用來判斷是不是c 編譯器,那...

C 和C的相互呼叫

在實際的工程中,c 和c的相互呼叫時不可避免的。但是有時候用c語言的編譯器編譯成的軟體包,在c 的程式中呼叫會出現錯誤。先看一下乙個例子 add.c include add.h int add int a,int b add.h int add int a,int b 將這兩個檔案用c語言編譯器編譯...