extern 的實用方法

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

1. 在源文件A裏定義的函數,在其它源文件裏是看不見的(即不能訪問)。爲了在源文件B裏能調    用這個函數,應該在B的頭部加上一個外部聲明:extern   函數原型;   
   這樣,在源文件B裏也可以調用那個函數了。 
2.extern用在變量聲明中常常有這樣一個作用,你在*.c文件中聲明瞭一個全局的變量,這個全局的變量如果要被引用,就放在*.h中並用extern來聲明。
3.如果定義函數的c/cpp文件在對應的頭文件中聲明瞭定義的函數,那麼在其他c/cpp文件中要使用這些函數,只需要包含這個頭文件即可。
  如果你不想包含頭文件,那麼在c/cpp中聲明該函數。一般來說,聲明定義在本文件的函數不用“extern”,聲明定義在其他文件中的函數用“extern”,這樣在本文件中調用別的文件定義的函數就不用包含頭文件
  include “*.h”來聲明函數,聲明後直接使用即可。
4.問題:extern “C”

  在C++環境下使用C函數的時候,常常會出現編譯器無法找到obj模塊中的C函數定義,從而導致鏈接失敗的情況,應該如何解決這種情況呢?

  答案與分析:
  C++語言在編譯的時候爲了解決函數的多態問題,會將函數名和參數聯合起來生成一箇中間的函數名稱,而C語言則不會,因此會造成鏈接時找不到對應函數的情況,此時C函數就需要用extern “C”進行鏈接指定,這告訴編譯器,請保持我的名稱,不要給我生成用於鏈接的中間函數名。
  下面是一個標準的寫法:
//在.h文件的頭上
#ifdef __cplusplus
#if __cplusplus
extern "C"{
 #endif
 #endif  
 …
 …
 //.h文件結束的地方
 #ifdef __cplusplus
 #if __cplusplus
}
#endif
#endif
 

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

注意:一個文件1中 變量聲明爲 靜態 static或函數聲明爲static  時 就不可以被別的文件2 引用,別的文件2只能通過文件1中的非靜態函數 來操作 文件1中的 靜態變量

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章