C 語法實驗室之extern關鍵字

2021-07-02 05:14:10 字數 1220 閱讀 1084

extern關鍵字網上不少資料,但我一直想說說自己認知,並加深我對此關鍵字的認識度。

在很久很久以前沒有c++這個東西,只有c,正如我剛開始程式設計的時候一樣,當時我只會簡單的c,**編譯的時候會把每個.c字尾檔案都編譯一遍,即使你從未用過這個檔案,他還是要被編譯,只要乙個檔案沒通過編譯就不行。

當時很不注意,每個檔案中都有一些全域性變數,當然的保證這些全域性變數都只在整個工程中定義一次,且不能重名。

例如a.c中有全域性的

int a=10;

int add(int a,int b)

他們的名字其實在初始化的事實就對映到全域性固定的位址上,所以在其他任何.c檔案中都不能再定義同樣名字的全域性普通成員,有人說那是不是函式和變數是分開的呢,可不可以定義乙個變數叫 

int add=1;這樣行嗎,答案是否定,因為在c語言裡所有全域性普通的成員名字都必須不一樣,法律是絕對的

那我能不能在別的檔案訪問a.c中的全域性普通成員呢,當然可以,所以設計者弄出了extern;

假如你在某個.c中的某個作用域想訪問a.c的全域性普通成員(但是又不想include引用a.h,或者a.c),只要在作用域的開始用extern宣告他們是來自別的c檔案的全域性普通成員就行了,因為所有c檔案中的所有全域性變數和函式都會自動初始化並分配位址,即使不include 如下

extern int a;

extern int add(int a,int b);

之後就可以盡情使用了,不過後來隨著時間發展,進入新世紀編譯器便認同extern int add(int a,int b);等效於int add(int a,int b);(不過加上extern語義更明確了)

但是千萬別認為編譯器會認同extern int a;等效於int a;那是不可能的,因為int a;本身就帶有定義的操作。而extern int a;是純申明沒定義。

但是後來c++出現了,類的出現,很少人還大面積使用全域性變數,即使使用也是帶有命名空間的使用方式,extern作為乙個歷史產物還是被保留至今,而且有extern 「c」這個用法來相容過去製作的c函式,方便匯出。

最後總結:

extern 用途一:用來純宣告乙個全域性非靜態變數

extern 用途二:用來引用並宣告乙個來自其他檔案的全域性非靜態成員。

extern 用途三:後面加「c」,extern 「c」用來匯出c風格的函式供c++或其他語言呼叫

Unity實驗室之Shader優化

最近有人問到寫shader需要注意哪些地方及如何優化,正好筆者也在研究這方面,這裡主要針對unity來說,其它平台或引擎也可以參考,本文主要分如下幾個方面來說 shader的選擇,屬性和狀態的設定,資料型別選擇,編寫,舉例,除錯 unity中現在可以新建4種shader,分別是standard su...

大蛇丸實驗室之Oracle by DWLIJX

大蛇丸實驗室1 為什麼有些查詢死活不走索引?不走索引結論 a 建立組合索引,但查詢謂詞並未使用組合索引的第一列,此處有乙個index skip scan概念。b 在包含有null值的table列上建立索引,當時使用select count from table時不會使用索引。c 在索引列上使用函式時...

AR實驗室 ARToolKit之概述篇

我從去年就開始對ar augmented reality 技術比較關注,但是去年ar行業一直處於偶爾發聲的狀態,絲毫沒有其 異姓同名 的兄弟vr virtual reality 火爆。至於mr mixed reality 更像是google glass事情之後對ar的洗白。但是今年ar行業出了件大事...