C語言中extern的用法

清風oo發表於2019-01-01

https://www.cnblogs.com/mch0dm1n/p/5727667.html

https://www.cnblogs.com/codingmengmeng/p/7220119.html

0x01

  extern用在變數或函式的宣告前,用來說明“此變數/函式是在別處定義的,要在此處引用”。

0x02

  extern修飾變數的宣告。

  舉例:若a.c中需引用b.c中的變數int v,可以在a.c中宣告extern int v,然後就可以引用變數v;需要注意的是,被引用的變數v的連結屬性必須是外連結(external)的,也就是說a.c要引用到變數v,不只是取決於在a.c中宣告extern int v,還取決於變數v本身是能夠被引用到的。這裡涉及到另外一個話題---變數的作用域。能夠被其他模組以extern引用到的變數通常是全域性變數。

  還有一點是,extern int v可以放在a.c中的任何地方,比如可以在a.c中函式func()定義的開頭處宣告extern int v,然後就可以引用到變數v了,只不過這樣只能在func()作用域中引用變數v(這還是變數作用域的問題,對於這一點來說,很多人使用時都心存顧慮,好像extern宣告只能用於檔案作用域似的)。

 

0x03

   extern修飾函式的宣告。

  本質上講,變數和函式沒有區別。函式名是指向函式二進位制塊開頭處的指標。如果檔案a.c要引用b.c中的函式,比如在b.c中原型是int func(int m),那麼就可以在a.c中宣告extern int func(int m),然後就能使用func()來做任何事情。就像變數的宣告一樣,extern int func(int m)可以放在a.c中的任何位置,而不一定非要放在a.c的檔案作用域的範圍中,

  對其他模組中函式的引用,最常用的方法是包含這些函式宣告的標頭檔案。使用extern和包含標頭檔案來引用函式的區別:extern的引用方式比包含標頭檔案要間接得多。extern的使用方法是直接了當的,想引用哪個函式就用extern宣告哪個函式。這大概是kiss原則的一種體現。這樣做的一個明顯的好處是,會加速程式的編譯(確切地說是預處理)的過程,節省時間。在大型C程式編譯過程中,這種差異是非常明顯的。

相關文章