C++中extern與static的用法

來源:互聯網
上載者:User
    C++中extern與static的用法很容易混淆,現總結如下:1.用於修飾全域變數的定義extern修飾全域變數的定義用於擴大全域變數的範圍,使其他檔案也可使用該全域變數static修飾全域變數的定義用於限定該全域變數只能在本檔案內使用我們知道每個.cpp檔案編譯後成為一個.obj檔案extern的作用就是使a.obj能使用b.obj中定義的全域變數static則限定b.obj中定義的全域變數只能在b.obj中使用,不能被a.obj使用。如:extern int a = 100;   定義全域變數,並擴大該全域變數的範圍為整個工程。static int a = 100;   定義全域變數,並限定全域變數的範圍為本模組。對於非const變數,不加任何修飾符預設為extern對於const變數,不加任何修飾符預設為staticextern const int a = 100;Note:在extern修飾全域變數的定義時,並須寫全定義式,如extern int a(0) 或 extern int a = 0。否則extern int a僅僅是修飾變數的聲明。2.extern用於修飾全域變數的聲明指出在該.cpp檔案中,後續使用的該變數定義在外部檔案中,這樣使該.cpp檔案能被編譯通過,後續連結會在該工程的其他檔案中尋找該變數的定義。extern int a;3.用於修飾函數的聲明與定義和修飾變數的含義一樣,不加任何修飾符的函式宣告與定義預設為externNote:同一工程下,a.cpp中有extern int a = 5;b.cpp中有extern int a = 10;連結時會報錯:"int a" already defined in ...若a.cpp中有static int a = 5;b.cpp中為static int a = 10;或extern int a = 10;則沒有錯誤。4.extern "C"C++語言在編譯的時候為瞭解決同名函數的重載問題,會將函數名和參數聯合起來產生一個中間的函數名稱,而C則不會,C是不支援函數重載的。extern "C"用於告訴編譯器按照C的方式產生函數名,這樣就能保證C的程式能調用C++語言寫的Dll。可以在cpp檔案中通過以下方式簡化extern "C"的使用
#ifdef __cplusplus  extern "C" {  #endif  代碼...... #ifdef __cplusplus  }  #endif
5.extern "C"與extern&static的混用注意不要被extern "C"中的extern蒙蔽了雙眼,不包含單獨使用extern時的含義。若在.cpp檔案中,定義一函數,使編譯器按照C的方式產生函數名稱並且擴大函數的範圍為整個工程,則如下定義:extern "C" extern int test(){return 0;}對應的如下函數的定義就不難理解了extern "C" static int test(){return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.