簡要介紹C C 中的兩個extern

2021-09-10 15:44:30 字數 1126 閱讀 1569

c語言中有乙個extern,c++中也有乙個extern,兩者是不同的。

當乙個工程中有多個檔案時(多檔案程式設計),要使用全域性變數,往往需要使用extern修飾宣告。

全域性變數本身是全域性可用的,即在所有的.c檔案中均可以使用,但因為c語言是單檔案編譯的,在main.c檔案中使用other.c檔案中宣告的全域性變數必須前加extern修飾,形如:other.c中定義的int a = 100; main.c中使用要extern int a; 後一句旨在告訴編譯器該變數在其他檔案中已經定義,以通過編譯。

所以extern存在的意義在於解決多檔案程式設計中跨檔案使用全域性變數編譯不能通過的問題。

注意:1.extern只能修飾全域性變數,不能修飾區域性變數,因為extern本身就是解決全域性變數使用中存在的問題;

2.main.c中使用other.c中定義的全域性變數,使用extern修飾宣告,不能再初始化,只是宣告;

3.main.c中extern int a;只是保證編譯通過,而在鏈結階段要去找這個a,如果other.c中真的定義了a則鏈結成功,否則鏈結失敗,會報錯。

c++中的extern要簡單一些,準確說是extern "c"。

我們知道c++是完全相容c語言的,就意味著完全相容c的標準庫及自製庫。那如何實現呢?就是通過extern "c"。

c++中預設在預處理階段對所有函式名採用name mangling(命名傾軋),來改變函式名,以此區分引數不同的同名函式。

對於乙個函式來說,它的宣告和定義要麼都傾軋,要麼都不傾軋,否則在鏈結階段就會出現錯誤。

我們在c++中使用c的標準庫或者自製庫(不存在命名傾軋)時,要保證其對應的標頭檔案或者函式宣告不參與命名傾軋,否則鏈結失敗。如果是單個函式宣告,則在前面加上extern "c"就能避免傾軋,如果是多個,則extern "c"。如果在c++中包含c庫對應的標頭檔案則是:extern "c" ,我們知道標頭檔案中全是函式宣告。

總之,c庫是不存在命名傾軋的,c++使用c庫時,要讓對應的函式宣告或者整個標頭檔案避免命名傾軋,就要加extern "c"。

ps:本人還是c/c++領域中的學徒,內功不夠深厚,即使對於一些個簡單的知識點表達的也不是很全面,難免有疏漏之處,還請讀者朋友見諒,提出改進意見。希望能和更多喜歡c/c++技術的朋友交流!

c c 中的兩個反正切函式

在c語言的math.h或c 中的cmath中有兩個求反正切的函式atan double x 與atan2 double y,double x 他們返回的值是弧度 要轉化為角度再自己處理下。前者接受的是乙個正切值 直線的斜率 得到夾角,但是由於正切的規律性本可以有兩個角度的但它卻只返回乙個,因為ata...

Python中的兩個內建模組介紹

使用了python一段時間程式設計客棧後,可以說python的基本單位就是模組了,在使用模組的時候我們一般會使用通過import語句來將其匯入,但是我們在沒有匯入任何模組的時候,我們卻能使用這樣的一些函式 int str len range 以及使用try except語句來捕獲異常,那麼這些又是從...

兩個重要函式的介紹

基本原理是利用函式 findhomography,該 函式是求兩幅影象的單應性矩陣或者叫 單對映矩陣 它是乙個3 3的矩陣。findhomography 計算多個二維點對之間的最優單對映變換矩陣 h 3行x3列 使用最小均方誤差或者ransac方法 單應性矩陣算過後的投影點的偏移量 scene co...