jasmine214--love

          只有當你的內心總是充滿快樂、美好的愿望和寧靜時,你才能擁有強壯的體魄和明朗、快樂或者寧靜的面容。
          posts - 731, comments - 60, trackbacks - 0, articles - 0

          C -extern使用

          Posted on 2010-11-29 15:29 幻海藍夢 閱讀(235) 評論(0)  編輯  收藏 所屬分類: C語言學習
          1 基本解釋

            extern可以置于變量或者函數前,以標示變量或者函數的定義在別的文件中,提示 編譯器遇到此變量和函數時在其他模塊中尋找其定義。

          另外,extern也可用來進行鏈接指定。
          2 問題:extern 變量

          在一個源文件里定義了一個數組:

          char a[6];

          在另外一個文件里用下列語句進行了聲明:

          extern char *a;

          請問,這樣可以嗎?

          答 案與分析:

          1)、不可以,程序運行時會告訴你非法訪問。原因在于,指向類型T的指針并不等價于類型T的數組。extern char *a聲明的是一個指針變量而不是字符數組,因此與實際的定義不同,從而造成運行時非法訪問。應該將聲明改為extern char a[ ]。

          2)、例子分析如下,如果a[] = "abcd",則外部變量a=0x61626364 (abcd的ASCII碼值),*a顯然沒有意義,如下圖:

          500)this.width=500;" width="500" border="0">
          顯然a指向的空間(0x61626364)沒有意義,易出現非法內存訪問。
            3)、在使用extern時候要嚴格對應聲明時的格式,在實際編程中,這樣的錯誤屢見不鮮。
          4)、extern用在變量聲明中常常有這樣一個 作用,你在*.c文件中聲明了一個全局的變量,這個全局的變量如果要被引用,就放在*.h中并用extern來聲明。
          3 問題:extern 函數1

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

          答案與分析:

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

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

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

          4 問題:extern 函數2

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

          答案與分析:

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

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

          5 問題: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 */

          原文; http://blog.chinaunix.net/u2/67661/showart_677178.html
          主站蜘蛛池模板: 北票市| 壤塘县| 昭平县| 讷河市| 寿阳县| 增城市| 雷山县| 西林县| 海伦市| 抚州市| 邹城市| 洞口县| 洛宁县| 旺苍县| 山东省| 枣阳市| 苍南县| 马边| 云安县| 婺源县| 奉贤区| 革吉县| 虞城县| 嫩江县| 沾益县| 三明市| 横山县| 乐安县| 隆德县| 洪湖市| 灵石县| 乐陵市| 冕宁县| 涞源县| 漯河市| 驻马店市| 布尔津县| 商城县| 湘潭市| 聊城市| 老河口市|