熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

C語言之extern聲明辨析[2]

2013-11-13 12:16:31  來源: .NET編程 


   問題extern 函數

  常常見extern放在函數的前面成為函數聲明的一部分那麼C語言的關鍵字extern在函數的聲明中起什麼作用?

  答案與分析

  如果函數的聲明中帶有關鍵字extern僅僅是暗示這個函數可能在別的源文件裡定義沒有其它作用即下述兩個函數聲明沒有明顯的區別

extern int f(); 和int f();


  當然這樣的用處還是有的就是在程序中取代include *h來聲明函數在一些復雜的項目中我比較習慣在所有的函數聲明前添加extern修飾

   問題extern 函數

  當函數提供方單方面修改函數原型時如果使用方不知情繼續沿用原來的extern申明這樣編譯時編譯器不會報錯但是在運行過程中因為少了或者多了輸入參數往往會照成系統錯誤這種情況應該如何解決?

  答案與分析

  目前業界針對這種情況的處理沒有一個很完美的方案通常的做法是提供方在自己的xxx_pubh中提供對外部接口的聲明然後調用方include該頭文件從而省去extern這一步以避免這種錯誤

  寶劍有雙鋒對extern的應用不同的場合應該選擇不同的做法

   問題extern C

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

  答案與分析

  C++語言在編譯的時候為了解決函數的多態問題會將函數名和參數聯合起來生成一個中間的函數名稱而C語言則不會因此會造成鏈接時找不到對應函數的情況此時C函數就需要用extern C進行鏈接指定這告訴編譯器請保持我的名稱不要給我生成用於鏈接的中間函數名

  下面是一個標准的寫法

//在h文件的頭上
#ifdef __cplusplus
#if __cplusplus
extern C{
 #endif
 #endif /* __cplusplus */
 …
 …
 //h文件結束的地方
 #ifdef __cplusplus
 #if __cplusplus
}
#endif
#endif /* __cplusplus */

[]  []  


From:http://tw.wingwit.com/Article/program/net/201311/15555.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.