C++ extern C

 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();
}
相關文章
相關標籤/搜索