乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      C 程序的外部變量與函數(shù)

       浮 生 2009-01-22

      C 程序的外部變量與函數(shù)

      武漢市東湖中學(xué) 
      朱海清 孟學(xué)楨


      摘要

       

      本文討論了C程序的外部變量和函數(shù)的一些性質(zhì),結(jié)合實(shí)際的編程,給出了使用外部變量和函數(shù)的方法。

      關(guān)鍵字:C程序,外部變量,函數(shù)

        C程序由一組對(duì)象組成,這些對(duì)象包括程序中所使用的變量和實(shí)現(xiàn)特定功能的函數(shù)。變量可以分為函數(shù)內(nèi)部定義、使用的變量和函數(shù)外部定義的變量,通常情況下,把函數(shù)內(nèi)部定義、使用的變量稱為內(nèi)部變量或局部變量,而將在函數(shù)外部定義的、供許多函數(shù)所使用的變量稱為外部變量,一般情況下,也可以稱為全局變量。
        由于C語(yǔ)言不允許在一個(gè)函數(shù)中定義其他函數(shù),因此函數(shù)本身是外部的。一般情況下,也可以說(shuō)函數(shù)是全局函數(shù)。
      在缺省情況下,外部變量與函數(shù)具有如下性質(zhì):所有通過(guò)名字對(duì)外部變量與函數(shù)的引用(即使這種引用來(lái)自獨(dú)立編譯的函數(shù))都是引用的同一對(duì)象(標(biāo)準(zhǔn)中把這一性質(zhì)稱為外部連接)。
        由于外部變量是可以全局訪問(wèn)的,這就為在函數(shù)之間交換數(shù)據(jù)提供了一種可以替代函數(shù)變?cè)祷刂档姆椒āH魏魏瘮?shù)都可以用名字來(lái)訪問(wèn)外部變量,只要這個(gè)名字已在某個(gè)地方做了說(shuō)明或定義。
      如果要在函數(shù)之間共享大量的變量,那么使用外部變量要比使用一個(gè)長(zhǎng)長(zhǎng)的變?cè)砀奖?、有效。然而,也可能?dǎo)致程序在各個(gè)函數(shù)之間產(chǎn)生太多的數(shù)據(jù)聯(lián)系。
        外部變量的用途還表現(xiàn)在它們比內(nèi)部變量有更大的作用域和更長(zhǎng)的生存期。內(nèi)部自動(dòng)變量只能在函數(shù)內(nèi)部使用,當(dāng)其所在函數(shù)被調(diào)用時(shí)開始存在,當(dāng)函數(shù)退出時(shí)消失。而外部變量是永久存在的,他們的值在從一次函數(shù)調(diào)用到下一次函數(shù)調(diào)用之間保持不變。因此,如果兩個(gè)函數(shù)必須共享某些數(shù)據(jù),而這兩個(gè)函數(shù)都互不調(diào)用對(duì)方,那么最為方便的是,把這些共享數(shù)據(jù)作為外部變量,而不是作為變?cè)獊?lái)傳遞。

      1、外部變量的定義和使用

        根據(jù)C語(yǔ)言標(biāo)準(zhǔn),在程序的所有源文件中,外部變量只能被定義一次,否則會(huì)導(dǎo)致重復(fù)定義的編譯錯(cuò)誤。

      1.1 外部變量的定義與聲明

        變量聲明用于通報(bào)變量的性質(zhì)(主要是變量的類型),而變量定義則除此之外還引起存儲(chǔ)分配。如果在函數(shù)的外部包含如下說(shuō)明:

      int    VarDesc;
      char	  Array[MAXVAL];
      
      那么這兩個(gè)說(shuō)明定義了外部變量VarDesc與Array,并為之分配存儲(chǔ)單元,同時(shí)也用作供源文件其余部分使用的說(shuō)明。另一方面,如下兩行:
      extern  int    VarDesc;
      extern  char	  Array[];
      
        為源文件剩余部分聲明了VarDesc是一個(gè)int 類型的外部變量,Array是一個(gè)char數(shù)組類型的外部變量(數(shù)組大小在其他地方確定),但這兩個(gè)聲明并沒(méi)有建立變量或?yàn)樗鼈兎峙浯鎯?chǔ)單元,其中關(guān)鍵字extern表明該外部變量在其他地方被定義。
         根據(jù)C語(yǔ)言標(biāo)準(zhǔn),外部變量雖然只能在某個(gè)文件中定義一次,但其作用域則是從其聲明處開始一直到其所在的被編譯的文件的末尾。因此其他文件可以通過(guò)extern說(shuō)明來(lái)訪問(wèn)它。

      1.2 外部變量的使用方式

         如果外部變量被不同的函數(shù)所引用,并且這些函數(shù)沒(méi)有集中在一個(gè)源文件中,而是分布在不同的源文件中,那么函數(shù)在引用這些外部變量時(shí),必須采取先聲明再使用的方式,否則,在編譯時(shí)會(huì)導(dǎo)致重復(fù)定義的編譯錯(cuò)誤。
         若在多個(gè)文件的多個(gè)函數(shù)中引用外部變量,就需要在這些函數(shù)中重復(fù)聲明外部變量。這種方式可以解決編譯問(wèn)題,但是代碼不夠簡(jiǎn)潔。因此,在實(shí)際的編程中,大都采取了將外部變量統(tǒng)一定義在一個(gè)C源文件中,這個(gè)C源文件一般被稱為global.c,然后在對(duì)應(yīng)的頭文件中,一般為global.h,聲明外部變量,最后在需要引用外部變量的源文件中使用#include "global.h"的方式,函數(shù)就可以引用所有的外部變量。因此,一般情況下,global.c內(nèi)容為:

      #include "global.h"	
      
      /* for example, define two vars */
      int    VarDesc;
      char	  Array[MAXVAL];
      /* other external var define */
      
      在對(duì)應(yīng)的global.h頭文件的內(nèi)容則為:
      #ifndef _GLOBAL_H   /* please insure _GLOBAL_H unique */
      #define _GLOBAL_H   /* avoid quotation iterativly */
      
      #ifdef __cplusplus
      extern "C" {
      #endif   /*__cplusplus */
      
      /* for example, declare two vars */
      extern  int    VarDesc;
      extern  char	  Array[];
      
      /* other external vars declaration */
      
      #ifdef __cplusplus
      }
      #endif  /* __cplusplus */
      
      #endif	/* _GLOBAL_H */
      
        此外,在實(shí)際的編程中,這兩個(gè)文件頭部還應(yīng)當(dāng)有公司copyright聲明、文件功能說(shuō)明、版本說(shuō)明、創(chuàng)建、修改歷史等。

      2、函數(shù)的定義和使用

        根據(jù)C語(yǔ)言標(biāo)準(zhǔn),函數(shù)只能被定義一次,而且在函數(shù)中,不能再定義函數(shù),因此函數(shù)本身是外部的。

      2.1 函數(shù)的定義與聲明

         定義函數(shù)是給出函數(shù)體的函數(shù)描述。一個(gè)函數(shù)只有在聲明之后才能被引用。函數(shù)聲明中,需給出函數(shù)名、返回類型、參數(shù)列表等。

        函數(shù)的作用域從其聲明處開始一直到其所在的被編譯的文件的末尾,如果一個(gè)函數(shù)在定義之前就要使用到,或者這個(gè)函數(shù)定義在與所要使用它的源文件不相同的源文件中,那么就需要在使用該函數(shù)前,使用關(guān)鍵字extern聲明該函數(shù),但由于函數(shù)默認(rèn)是external的,因此函數(shù)聲明前的extern可以省略,這也是標(biāo)準(zhǔn)庫(kù)函數(shù)的頭文件中,函數(shù)聲明前沒(méi)有extern的原因,但在實(shí)際的編程中,一般不推薦這樣做,應(yīng)當(dāng)在函數(shù)聲明前加上extern。

      2.2 函數(shù)的組織和使用

        如果某個(gè)函數(shù)需要引用另一個(gè)函數(shù),則需要在引用該函數(shù)前聲明被引用的函數(shù),否則可能會(huì)導(dǎo)致函數(shù)未定義錯(cuò)誤。

         為了避免被引用函數(shù)的重復(fù)聲明和方便函數(shù)的引用,在實(shí)際的編程之中,采用在對(duì)應(yīng)的頭文件中,統(tǒng)一聲明函數(shù)的方式。需要引用某一個(gè)函數(shù)時(shí),只需要在該函數(shù)的定義源文件中包含被引用函數(shù)的頭文件即可。 
        在實(shí)際的編程中,在頭文件中聲明函數(shù),即聲明函數(shù)原型,在對(duì)應(yīng)的C源文件中,定義函數(shù)及其實(shí)現(xiàn)代碼。 因此,函數(shù)說(shuō)明的頭文件內(nèi)容和格式為:

      #ifndef _FUNCNAME_H   /* please insure _ FUNCNAME _H unique */
      #define _ FUNCNAME _H   /* avoid quotation iterativly */
      
      #ifdef __cplusplus
      extern "C" {
      #endif   /*__cplusplus */
      
      /* for example, declare functions */
      extern  int    func (int, int, int);
      /* of course, maybe declare functions like below 
      * int    func (int, int, int);
      */
      /* other functions declaration */
      
      #ifdef __cplusplus
      }
      #endif  /* __cplusplus */
      
      #endif	/* _ FUNCNAME _H */
      
      而在對(duì)應(yīng)的C源文件內(nèi)容為:
      #include " funcname.h"
      
      /* for example, define two vars */
      int    func (int a, int b, int c)
      {
      		// functions body
      }
      
      /* other functions define */
      
      在實(shí)際的函數(shù)頭文件和定義文件中還應(yīng)當(dāng)包含相應(yīng)的頭文件等,以及公司copyright聲明、文件功能說(shuō)明、版本說(shuō)明、創(chuàng)建、修改歷史等。對(duì)于具體的函數(shù),還應(yīng)當(dāng)有函數(shù)說(shuō)明、輸入?yún)?shù)說(shuō)明、返回說(shuō)明、例外等。

      3、靜態(tài)外部變量和函數(shù)

        如果某外部變量和函數(shù)僅供它們各自所在的源文件中的函數(shù)使用,而不能被其他函數(shù)訪問(wèn),那么就必須使用static關(guān)鍵字定義外部變量和函數(shù)。static說(shuō)明適用于外部變量與函數(shù),用于把這些對(duì)象的作用域限定為被編譯源文件的剩余部分。通過(guò)外部static對(duì)象,可以把一些外部變量和函數(shù)隱藏在某個(gè)源文件中,使得這些外部變量和函數(shù)僅僅可以被該源文件使用和共享,但不能被該源文件之外的函數(shù)所引用。
        另外,static說(shuō)明也可以用于說(shuō)明內(nèi)部變量。內(nèi)部靜態(tài)變量就像自動(dòng)變量一樣局部于某一個(gè)特定函數(shù),只能在該函數(shù)中使用,但與自動(dòng)變量不同的是,不管其所作函數(shù)是否被調(diào)用,它都是一直存在的,而不像自動(dòng)變量那樣,隨著所在函數(shù)的調(diào)用與退出而存在與消失。換而言之,內(nèi)部靜態(tài)變量是一種只能在某一特定函數(shù)中使用的但一直占據(jù)存儲(chǔ)空間的變量。 
        一般情況下,為保證靜態(tài)外部變量和函數(shù)能夠被本源文件的函數(shù)所引用,需要在該源文件的所有函數(shù)之前定義靜態(tài)外部變量和函數(shù)。 那么,該C源文件的內(nèi)容為:

      #include “funcname.h”	
      
      /* for example, define one static external var and one static function */
      static   int VarName = 0;
      static   int function (int a)
      {
      		// function body
      }
      /* other static vars and functions */
      
      /* for example, define one function */
      char	  func (char*, char)
      {		
      		VarName = 5;
      		function (VarName);
      		// other function body
      }
      
      /* other functions define */
      
      參考文獻(xiàn):
      • B.W.Kernighan, D.M.Ritchie著,徐寶文譯,機(jī)械工業(yè)出版社 《C程序設(shè)計(jì)語(yǔ)言(第2版)》
      • Bjarne Stroustrup著,裘宗燕譯, 機(jī)械工業(yè)出版社 《C++程序設(shè)計(jì)語(yǔ)言(特別版)》

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多