一、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語言編譯器編譯...