- 編寫高質量代碼:改善C程序代碼的125個建議
- 馬偉 著
- 1085字
- 2019-01-01 01:33:14
建議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引用外部變量,可以在引用的模塊內修改其變量的值,因此,如果有多個文件同時要對應用的變量進行操作,而且可能會修改該變量,那就會影響其他模塊的使用。因此,我們要慎重使用。
- Learning ROS for Robotics Programming(Second Edition)
- OpenCV實例精解
- 構建移動網站與APP:HTML 5移動開發入門與實戰(跨平臺移動開發叢書)
- arc42 by Example
- 信息可視化的藝術:信息可視化在英國
- Reactive Programming with Swift
- PHP 編程從入門到實踐
- Java應用開發技術實例教程
- Getting Started with NativeScript
- Yii Project Blueprints
- Python全棧開發:基礎入門
- Microsoft Exchange Server 2016 PowerShell Cookbook(Fourth Edition)
- 零基礎PHP從入門到精通
- MySQL數據庫教程(視頻指導版)
- Building Scalable Apps with Redis and Node.js