1 /****test.cpp****/ 2 3 #include<iostream> 4 using namespace std; 5 extern "C" //利用C編譯器的符號規則生成_value 6 { 7 int value(); 8 } 9 int main(){ 10 cout<<value()<<endl; 11 } 12 13 /* 14 extern 是C/C++語言中代表函數和全局變量做用範圍(可見性) 15 的關鍵字,該關鍵字告訴編譯器,其聲明的函數和變量能夠在"全局"範圍使用。 16 17 例如:extern int a;是對全局變量a的聲明語句. 18 19 extern "C"包含兩重含義: 20 一、被它修飾的目標是"extern" 21 二、它修飾的目標是C 22 23 對於全局變量和函數,C語言與C++語言的編譯、鏈接方式不一樣: 24 一、C++做爲一種面向對象的語言,C++支持函數重載,而C語言則不支持。 25 所以,全局變量或函數被C++編譯後在符號庫中的名字與C語言不一樣。 26 二、C++除了支持全局變量外,還支持類的成員變量和局部變量。編譯器在 27 進行編譯時,對局部變量是經過局部變量在棧上距幀指針ebp的偏移量進行反問的, 28 對類的成員變量是經過其相對於對象首地址偏移量進行訪問的。 29 */
1 /***** value.c ****/ 2 //由於是.c文件 因此對應於C的value()函數聲明 3 int value(){ 4 return 5; 5 }
在C中調用C++函數:ios
1 /****invokecpp.h****/ 2 /* 3 使用C編譯符號規則 4 */ 5 extern "C"{ 6 void show(); 7 }
1 /****invokecpp.cpp*****/ 2 #include<cstdio> 3 #include"invokecpp.h" 4 /* 5 爲了讓函數void show();可以被C語言程序調用,必須用 6 extern"C" 通知編譯器採用C語言的規則解析函數名,這個 7 工做可在頭文件invokecpp.h中完成。 8 */ 9 void show(){ 10 printf("Hello"); 11 }
/***main.c****/ /* 在C語言源文件main.c中,不能直接包含invokecpp.h 由於C語言不支持extern "C"聲明。在.c文件中包含了extern "C"時 會出現編譯錯誤。因此在main.c中,應直接進行函數原型聲明,這樣, 編譯器可在全部參與鏈接的目標文件中尋找名字爲_show的函數調用。 */ void show(); int main(){ show(); }