日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

外部变量和外部函数

發(fā)布時間:2023/12/10 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 外部变量和外部函数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
C程序由一組對象組成,這些對象包括程序中所使用的變量和實(shí)現(xiàn)特定功能的函數(shù)。變量可以分為函數(shù)內(nèi)部定義、使用的變量和函數(shù)外部定義的變量,通常情況下,把函數(shù)內(nèi)部定義、使用的變量稱為內(nèi)部變量或局部變量,而將在函數(shù)外部定義的、供許多函數(shù)所使用的變量稱為外部變量,一般情況下,也可以稱為全局變量。

  由于C語言不允許在一個函數(shù)中定義其他函數(shù),因此函數(shù)本身是外部的。一般情況下,也可以說函數(shù)是全局函數(shù)。在缺省情況下,外部變量與函數(shù)具有如下性質(zhì):所有通過名字對外部變量與函數(shù)的引用(即使這種引用來自獨(dú)立編譯的函數(shù))都是引用的同一對象(標(biāo)準(zhǔn)中把這一性質(zhì)稱為外部連接)。

  由于外部變量是可以全局訪問的,這就為在函數(shù)之間交換數(shù)據(jù)提供了一種可以替代函數(shù)變元欲返回值的方法。任何函數(shù)都可以用名字來訪問外部變量,只要這個名字已在某個地方做了說明或定義。如果要在函數(shù)之間共享大量的變量,那么使用外部變量要比使用一個長長的變元表更方便、有效。然而,也可能導(dǎo)致程序在各個函數(shù)之間產(chǎn)生太多的數(shù)據(jù)聯(lián)系。

  外部變量的用途還表現(xiàn)在它們比內(nèi)部變量有更大的作用域和更長的生存期。內(nèi)部自動變量只能在函數(shù)內(nèi)部使用,當(dāng)其所在函數(shù)被調(diào)用時開始存在,當(dāng)函數(shù)退出時消失。而外部變量是永久存在的,他們的值在從一次函數(shù)調(diào)用到下一次函數(shù)調(diào)用之間保持不變。因此,如果兩個函數(shù)必須共享某些數(shù)據(jù),而這兩個函數(shù)都互不調(diào)用對方,那么最為方便的是,把這些共享數(shù)據(jù)作為外部變量,而不是作為變元來傳遞。

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

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

1.1 外部變量的定義與聲明

  變量聲明用于通報(bào)變量的性質(zhì)(主要是變量的類型),而變量定義則除此之外還引起存儲分配。如果在函數(shù)的外部包含如下說明:
  • int? ? VarDesc;
  • char? ? ? ?? ?Array[MAXVAL];
  • 復(fù)制代碼 那么這兩個說明定義了外部變量VarDesc與Array,并為之分配存儲單元,同時也用作供源文件其余部分使用的說明。另一方面,如下兩行:
  • extern??int? ? VarDesc;
  • extern??char? ? ? ?? ?Array[];
  • 復(fù)制代碼 為源文件剩余部分聲明了VarDesc是一個int 類型的外部變量,Array是一個char數(shù)組類型的外部變量(數(shù)組大小在其他地方確定),但這兩個聲明并沒有建立變量或?yàn)樗鼈兎峙浯鎯卧?#xff0c;其中關(guān)鍵字extern表明該外部變量在其他地方被定義。

      根據(jù)C語言標(biāo)準(zhǔn),外部變量雖然只能在某個文件中定義一次,但其作用域則是從其聲明處開始一直到其所在的被編譯的文件的末尾。因此其他文件可以通過extern說明來訪問它。

    1.2 外部變量的使用方式

      如果外部變量被不同的函數(shù)所引用,并且這些函數(shù)沒有集中在一個源文件中,而是分布在不同的源文件中,那么函數(shù)在引用這些外部變量時,必須采取先聲明再使用的方式,否則,在編譯時會導(dǎo)致重復(fù)定義的編譯錯誤。

      若在多個文件的多個函數(shù)中引用外部變量,就需要在這些函數(shù)中重復(fù)聲明外部變量。這種方式可以解決編譯問題,但是代碼不夠簡潔。因此,在實(shí)際的編程中,大都采取了將外部變量統(tǒng)一定義在一個C源文件中,這個C源文件一般被稱為global.c,然后在對應(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 */
  • 復(fù)制代碼 在對應(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 */
  • 復(fù)制代碼 此外,在實(shí)際的編程中,這兩個文件頭部還應(yīng)當(dāng)有公司copyright聲明、文件功能說明、版本說明、創(chuàng)建、修改歷史等。

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

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

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

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

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

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

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

      為了避免被引用函數(shù)的重復(fù)聲明和方便函數(shù)的引用,在實(shí)際的編程之中,采用在對應(yīng)的頭文件中,統(tǒng)一聲明函數(shù)的方式。需要引用某一個函數(shù)時,只需要在該函數(shù)的定義源文件中包含被引用函數(shù)的頭文件即可。

      在實(shí)際的編程中,在頭文件中聲明函數(shù),即聲明函數(shù)原型,在對應(yīng)的C源文件中,定義函數(shù)及其實(shí)現(xiàn)代碼。因此,函數(shù)說明的頭文件內(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 */
  • 復(fù)制代碼 而在對應(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 */
  • 復(fù)制代碼 在實(shí)際的函數(shù)頭文件和定義文件中還應(yīng)當(dāng)包含相應(yīng)的頭文件等,以及公司copyright聲明、文件功能說明、版本說明、創(chuàng)建、修改歷史等。對于具體的函數(shù),還應(yīng)當(dāng)有函數(shù)說明、輸入?yún)?shù)說明、返回說明、例外等。

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

      如果某外部變量和函數(shù)僅供它們各自所在的源文件中的函數(shù)使用,而不能被其他函數(shù)訪問,那么就必須使用static關(guān)鍵字定義外部變量和函數(shù)。static說明適用于外部變量與函數(shù),用于把這些對象的作用域限定為被編譯源文件的剩余部分。通過外部static對象,可以把一些外部變量和函數(shù)隱藏在某個源文件中,使得這些外部變量和函數(shù)僅僅可以被該源文件使用和共享,但不能被該源文件之外的函數(shù)所引用。

      另外,static說明也可以用于說明內(nèi)部變量。內(nèi)部靜態(tài)變量就像自動變量一樣局部于某一個特定函數(shù),只能在該函數(shù)中使用,但與自動變量不同的是,不管其所作函數(shù)是否被調(diào)用,它都是一直存在的,而不像自動變量那樣,隨著所在函數(shù)的調(diào)用與退出而存在與消失。換而言之,內(nèi)部靜態(tài)變量是一種只能在某一特定函數(shù)中使用的但一直占據(jù)存儲空間的變量。

      一般情況下,為保證靜態(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 */
  • 復(fù)制代碼




    外部變量,變量定義在其他文件中全局變量 extern可以置于變量或者函數(shù)前,以表示變量或者函數(shù)的定義在別的文件中,提示編譯器遇到此變量和函數(shù)時在其他模塊中尋找其定義。

    C語言外部變量的使用以及extern的用法

    C語言的外部變量的定義和引用對初學(xué)者來說,是個難點(diǎn).

    對外部變量的說明和定義不是一回事.對外部變量的說明,只是聲明該變量是在外部定義過的一個全局變量..在這里引用.而對外部變量的定義,則是要分配存儲單元.一個全局變量只能定義一次,卻可以多次引用.

    用extern聲明外部變量,目的是可以在其它的文件中調(diào)用.具體使用見下面的例子:

    ??????????????? file1.c?????????????????????????????????????????????????????? file2.c

    ??????? int i,j;//定義全局變量??????????????????????????????? extern?? int i,j;//外部變量說明

    ??????? char c;??????????????????????????????????????????????????????? extern char c;

    ?????? void func()??????????????????????????????????????????????????? void func1()

    ???? {???????????????????????????????????????????????????????????????????? {

    ???????? }??????????????????????????????????????????????????????????????????? }

    在file2.c中對外部變量i,j,c進(jìn)行了說明,就可以直接調(diào)用file1.c中定義的全局變量了

    靜態(tài)變量static的使用

    有時在中斷程序中定義了變量,不希望每次進(jìn)入中斷程序,變量就被賦初值.這時就要使用static變量.靜態(tài)局部變量在編譯時賦初值,既只賦初值一次.見下例:

    void serial_interrupt() interrupt 4 using 3

    { static uchar i="0";

    ?? i++;

    }

    上例中,編譯時,i被賦初值0,以后每進(jìn)入一次中斷,i+1,而不是每次進(jìn)入中斷,i都被請零,再加1

    如果在a.c中要調(diào)用在b.c中定義的函數(shù)func(),需要在a.c中聲明該函數(shù),表示該函數(shù)在別的源文件中定義。函數(shù)是可以互相調(diào)用的,因此函數(shù)都具有外部存儲種類的屬性。原則上調(diào)用一個在在本程序模塊文件以外的其他模塊文件所定義的函數(shù),必須用關(guān)鍵字extern說明被調(diào)用函數(shù)是一個外部函數(shù)。實(shí)際使用中可以省掉extern。即下面兩個函數(shù)聲明沒有明顯的區(qū)別:

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

    例如;

    #include "2.h"
    extern int a;
    int _tmain(int argc, _TCHAR* argv[])
    {
    ?test();
    ?printf("%d\n",a);
    ?
    ?return 0;
    }

    ?

    #include "2.h"
    ?int a;
    int test()
    {
    ?a=10;
    ?return 0;
    }

    //結(jié)果a=10;

    總結(jié)

    以上是生活随笔為你收集整理的外部变量和外部函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。