C 程序的外部變量與函數(shù) 摘要
本文討論了C程序的外部變量和函數(shù)的一些性質,結合實際的編程,給出了使用外部變量和函數(shù)的方法。 關鍵字:C程序,外部變量,函數(shù) C程序由一組對象組成,這些對象包括程序中所使用的變量和實現(xiàn)特定功能的函數(shù)。變量可以分為函數(shù)內部定義、使用的變量和函數(shù)外部定義的變量,通常情況下,把函數(shù)內部定義、使用的變量稱為內部變量或局部變量,而將在函數(shù)外部定義的、供許多函數(shù)所使用的變量稱為外部變量,一般情況下,也可以稱為全局變量。 1、外部變量的定義和使用 1.1 外部變量的定義與聲明 變量聲明用于通報變量的性質(主要是變量的類型),而變量定義則除此之外還引起存儲分配。如果在函數(shù)的外部包含如下說明: int VarDesc; char Array[MAXVAL];那么這兩個說明定義了外部變量VarDesc與Array,并為之分配存儲單元,同時也用作供源文件其余部分使用的說明。另一方面,如下兩行: extern int VarDesc; extern char Array[];為源文件剩余部分聲明了VarDesc是一個int 類型的外部變量,Array是一個char數(shù)組類型的外部變量(數(shù)組大小在其他地方確定),但這兩個聲明并沒有建立變量或為它們分配存儲單元,其中關鍵字extern表明該外部變量在其他地方被定義。 根據(jù)C語言標準,外部變量雖然只能在某個文件中定義一次,但其作用域則是從其聲明處開始一直到其所在的被編譯的文件的末尾。因此其他文件可以通過extern說明來訪問它。 1.2 外部變量的使用方式 如果外部變量被不同的函數(shù)所引用,并且這些函數(shù)沒有集中在一個源文件中,而是分布在不同的源文件中,那么函數(shù)在引用這些外部變量時,必須采取先聲明再使用的方式,否則,在編譯時會導致重復定義的編譯錯誤。 #include "global.h" /* for example, define two vars */ int VarDesc; char Array[MAXVAL]; /* other external var define */在對應的global.h頭文件的內容則為: #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 */此外,在實際的編程中,這兩個文件頭部還應當有公司copyright聲明、文件功能說明、版本說明、創(chuàng)建、修改歷史等。 2、函數(shù)的定義和使用 根據(jù)C語言標準,函數(shù)只能被定義一次,而且在函數(shù)中,不能再定義函數(shù),因此函數(shù)本身是外部的。 2.1 函數(shù)的定義與聲明 定義函數(shù)是給出函數(shù)體的函數(shù)描述。一個函數(shù)只有在聲明之后才能被引用。函數(shù)聲明中,需給出函數(shù)名、返回類型、參數(shù)列表等。 函數(shù)的作用域從其聲明處開始一直到其所在的被編譯的文件的末尾,如果一個函數(shù)在定義之前就要使用到,或者這個函數(shù)定義在與所要使用它的源文件不相同的源文件中,那么就需要在使用該函數(shù)前,使用關鍵字extern聲明該函數(shù),但由于函數(shù)默認是external的,因此函數(shù)聲明前的extern可以省略,這也是標準庫函數(shù)的頭文件中,函數(shù)聲明前沒有extern的原因,但在實際的編程中,一般不推薦這樣做,應當在函數(shù)聲明前加上extern。 2.2 函數(shù)的組織和使用 如果某個函數(shù)需要引用另一個函數(shù),則需要在引用該函數(shù)前聲明被引用的函數(shù),否則可能會導致函數(shù)未定義錯誤。 為了避免被引用函數(shù)的重復聲明和方便函數(shù)的引用,在實際的編程之中,采用在對應的頭文件中,統(tǒng)一聲明函數(shù)的方式。需要引用某一個函數(shù)時,只需要在該函數(shù)的定義源文件中包含被引用函數(shù)的頭文件即可。 #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 */ 而在對應的C源文件內容為: #include " funcname.h" /* for example, define two vars */ int func (int a, int b, int c) { // functions body } /* other functions define */在實際的函數(shù)頭文件和定義文件中還應當包含相應的頭文件等,以及公司copyright聲明、文件功能說明、版本說明、創(chuàng)建、修改歷史等。對于具體的函數(shù),還應當有函數(shù)說明、輸入?yún)?shù)說明、返回說明、例外等。 3、靜態(tài)外部變量和函數(shù) 如果某外部變量和函數(shù)僅供它們各自所在的源文件中的函數(shù)使用,而不能被其他函數(shù)訪問,那么就必須使用static關鍵字定義外部變量和函數(shù)。static說明適用于外部變量與函數(shù),用于把這些對象的作用域限定為被編譯源文件的剩余部分。通過外部static對象,可以把一些外部變量和函數(shù)隱藏在某個源文件中,使得這些外部變量和函數(shù)僅僅可以被該源文件使用和共享,但不能被該源文件之外的函數(shù)所引用。 #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 */參考文獻:
|
|