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
          主站蜘蛛池模板: 互助| 尉犁县| 阳城县| 北流市| 资溪县| 大埔区| 衢州市| 平利县| 新巴尔虎右旗| 二手房| 栖霞市| 松潘县| 怀安县| 万荣县| 云霄县| 五大连池市| 宜川县| 永福县| 昭平县| 安远县| 张家口市| 唐山市| 石渠县| 姜堰市| 桃园县| 西昌市| 阿坝| 黎川县| 榆林市| 临城县| 青川县| 洱源县| 枞阳县| 阿合奇县| 政和县| 泰安市| 遂平县| 习水县| 新龙县| 浠水县| 华容县|