extern關鍵字


extern關鍵字有兩個作用

一、告知編譯器:當extern與“c”一起使用的時候,就是告訴編譯器,下面的函數或者變量以C語言的方式編譯。這里主要是因為一方面我們可以使用C語言寫成的項目運用到C++中,另一方面由於C++支持重載而C不支持,這就導致了C++在編譯的時候,C++的函數名會和參數一起被編成函數名,而C只是函數名。所以在鏈接的時候,找不到我們定義的那個函數。

1 //模塊A頭文件 moduleA.h
2 #idndef _MODULE_A_H  //對於模塊A來說,這個宏是為了防止頭文件的重復引用
3 #define _MODULE_A_H
4  
5 int foo(int x, int y);
6 #endif 
//模塊B實現文件 moduleB.cpp
#include"moduleA.h"
foo(2,3); 

上面的兩個模塊如果用C++編譯以后,那我們的obj文件的模塊A的foo函數的函數名可能是_foo_int_int(每個編譯器的值不同),但是模塊B的函數名是_foo,這樣我們去找A的話是找不到,所以就會有錯誤。

 1 //moduleA頭文件
 2 #ifndef __MODULE_A_H //對於模塊A來說,這個宏是為了防止頭文件的重復引用
 3 #define __MODULE_A_H
 4 int fun(int, int);
 5 #endif
 6  
 7 //moduleA實現文件moduleA.C //模塊A的實現部分並沒有改變
 8 #include"moduleA"
 9  
10 int fun(int a, int b)
11 {
12     return a+b;
13 }
14 
15 //moduleB頭文件
16 #idndef __MODULE_B_H //很明顯這一部分也是為了防止重復引用
17 #define __MODULE_B_H
18  
19 #ifdef __cplusplus //而這一部分就是告訴編譯器,如果定義了__cplusplus(即如果是cpp文件, extern "C"{ //因為cpp文件默認定義了該宏),則采用C語言方式進行編譯
20  
21 #include"moduleA.h"
22 #endif
23  
24//其他代碼
25  
26 #ifdef __cplusplus
27 }
28 #endif
29 #endif
30  
31 //moduleB實現文件 moduleB.cpp //B模塊的實現也沒有改變,只是頭文件的設計變化了
32 #include"moduleB.h"
33 int main()
34 {
35     cout<<fun(2,3)<<endl;
36 }

 這里我們看到#ifdef __cplusplus這個宏告訴C++編譯器如果遇到extern “C” 則以c語言的方式編譯。這樣我們fun(int ,int)函數編譯以后就是_fun,所以在調用的時候我們根據_fun就可以找到函數的定義了。

二、就是共享:extern可以置於變量或者函數前,以標示變量或者函數的定義在別的文件中,提示編譯器遇到此變量和函數時在其他模塊中尋找其定義。此外extern也可用來進行鏈接指定。

 1 //在test1.h中有下列聲明:
 2 #ifndef TEST1H
 3 #define TEST1H
 4 extern char g_str[]; // 聲明全局變量g_str
 5 void fun1();
 6 #endif
 7 
 8 // 在test1.cpp中
 9 #include "test1.h"
10 char g_str[] = "123456"; // 定義全局變量g_str
11 void fun1() { cout << g_str << endl; }
12 
13 //以上是test1模塊, 它的編譯和連接都可以通過,如果我們還有test2模塊也想使用g_str,只需要在原文件中引用就可以了
14 #include "test1.h"
15 void fun2()    { cout << g_str << endl;    }

 

在test2中我們就可以使用test1的變量。

參考:https://www.cnblogs.com/carsonzhu/p/5272271.html、https://www.cnblogs.com/yuxingli/p/7821102.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM