全局變量

程序設計中,全局變量是在所有作用域都可訪問的變量,與之對應的是局部變量

通常,使用不必要的全局變量被認為是壞習慣,這正是由於全局變量的非局部性:全局變量可能被從任何地方修改(除非位於保護內存中),也可能被任何地方所依賴。於是全局變量便擁有了建立相互依存關係的無限可能,而互相依存關係的建立會使得複雜度增加,參見遠隔作用(Action at distance)。然而,在少數情況下是適合使用全局變量的。例如,可以通過全局變量的使用來避免常用變量在一系列函數間的頻繁傳遞。

例子

C++語言中全局變量的例子:

#include <cstdio>

int global = 3; // 定义全局变量 global

static void ChangeGlobal(void)
{
   global = 5; // 从函数中引用全局变量
}

int main(void)
{
   std::printf("%d\n", global); // 还是从函数中引用全局变量
   ChangeGlobal();
   std::printf("%d\n", global);
}

因為變量是全局的,所以就沒有必要為了在 main 以外的函數中使用而作為參數傳遞。全局變量屬於程序中的所有函數。

輸出應該是:

3
5

全局變量的使用使得軟件更加難以閱讀和理解。因為程序中任何地方的代碼都可能隨時修改這個變量的值,於是理解這個變量可能就意味着要理解整個程序的很大部分。

某些語言(比如C#Java)中沒有全局變量。Java 中,所有非局部變量都是類的字段,於是所有變量就都在類和方法的作用域中了。

需要指出的是,C語言不存在真正意義上的「全局變量」。被習慣性誤稱為「全局變量」的,一般是文件作用域對象。ANSI C/ISO C也沒有這種提法。 C語言中所謂「全局變量」的例子:

/* 注意这个例子是有问题的。
   global 并不是全局变量,因为它并不是“所有作用域均可见”。
   global 是C语言中的文件作用域变量,作用域从声明开始一直到文件末尾。*/
#include <stdio.h>

int global = 3; /* 这是“全局变量” */

static void ChangeGlobal(void)
{
   global = 5; /* 从函数中引用“全局变量” */
}

int main(void)
{
   printf("%d\n", global); /* 还是从函数中引用“全局变量” */
   ChangeGlobal();
   printf("%d\n", global);
   return 0;
}

參見

參考資料

  • William Wulf and Mary Shaw, 「Global Variable Considered Harmful」, ACM SIGPLAN Notices, volume 8, issue 2, 1973 February, pp. 28–34.