官术网_书友最值得收藏!

建議8-2:慎用extern聲明外部變量

我們都知道,程序的編譯單位是源程序文件,一個源文件可以包含一個或若干個函數。在函數內定義的變量是局部變量,而在函數之外定義的變量則稱為外部變量,外部變量也就是我們所講的全局變量。它的存儲方式為靜態存儲,其生存周期為整個程序的生存周期。全局變量可以為本文件中的其他函數所共用,它的有效范圍為從定義變量的位置開始到本源文件結束。

然而,如果全局變量不在文件的開頭定義,有效的作用范圍將只限于其定義處到文件結束。如果在定義點之前的函數想引用該全局變量,則應該在引用之前用關鍵字extern對該變量作“外部變量聲明”,表示該變量是一個已經定義的外部變量。有了此聲明,就可以從“聲明”處起,合法地使用該外部變量。

來看一個簡單的例子,如代碼清單1-25所示。

代碼清單1-25 extern使用示例


#include <stdio.h>
int max(int x,int y);
int main(void)
{
    int result;
    /*外部變量聲明*/
    extern int g_X;
    extern int g_Y;
    result = max(g_X,g_Y);
    printf("the max value is %d\n",result);
    return 0;
}
/*定義兩個全局變量*/
int g_X = 10;
int g_Y = 20;
int max(int x, int y)
{
    return (x>y ? x : y);
}

在代碼清單1-25中,全局變量g_X與g_Y是在main函數之后聲明的,因此它的作用范圍不在main函數中。如果我們需要在main函數中調用它們,就必須使用extern來對變量g_X與g_Y作“外部變量聲明”,以擴展全局變量的作用域。也就是說,如果在變量定義之前要使用該變量,則應在使用之前加extern聲明變量,使作用域擴展到從聲明開始到本文件結束。

如果整個工程由多個源文件組成,在一個源文件中想引用另外一個源文件中已經定義的外部變量,同樣只需在引用變量的文件中用extern關鍵字加以聲明即可。下面就來看一個多文件的示例,如代碼清單1-26-max與代碼清單1-26-main所示。

代碼清單1-26-max 1-26-max.c


#include <stdio.h>
/*外部變量聲明*/
extern int g_X ;
extern int g_Y ;
int max()
{
    return (g_X > g_Y ? g_X : g_Y);
}

代碼清單1-26-main 1-26-main.c


#include <stdio.h>
/*定義兩個全局變量*/
int g_X=10;
int g_Y=20;
int max();
int main(void)
{
    int result;
    result = max();
    printf("the max value is %d\n",result);
    return 0;
}

代碼清單1-26-max與代碼清單1-26-main的運行結果如圖1-40所示。

圖1-40 代碼清單1-26-max與代碼清單1-26-main的運行結果

對于多個文件的工程,都可以采用上面這種方法來操作。對于模塊化的程序文件,可在其文件中預先留好外部變量的接口,也就是只采用extern聲明變量,而不定義變量,代碼清單1-26-max里的g_X與g_Y就是如此操作的。通常,這些外部變量的接口都是在模塊程序的頭文件中聲明的,當需要使用該模塊時,只需要在使用時具體定義一下這些外部變量即可。代碼清單1-26-main里的g_X與g_Y則是相關示例。

不過,需要特別注意的是,由于用extern引用外部變量,可以在引用的模塊內修改其變量的值,因此,如果有多個文件同時要對應用的變量進行操作,而且可能會修改該變量,那就會影響其他模塊的使用。因此,我們要慎重使用。

主站蜘蛛池模板: 南溪县| 如皋市| 密云县| 韩城市| 麻阳| 深泽县| 三明市| 丰镇市| 乌拉特后旗| 额济纳旗| 韶山市| 寿宁县| 杨浦区| 孟津县| 宜宾县| 吉安县| 丹阳市| 高碑店市| 疏勒县| 龙陵县| 钦州市| 武邑县| 延安市| 武城县| 南和县| 红原县| 普兰县| 凌源市| 麻栗坡县| 新郑市| 玉田县| 乌拉特中旗| 武威市| 调兵山市| 湄潭县| 张家港市| 珠海市| 察哈| 汶上县| 北川| 容城县|