你必須要小心這裏。 「環球」變量是那些可在代碼中的任何一點,但有全球標準沒有正式定義 - 它使用類似範圍,存儲時間和聯動較正式用詞。全球的
一個定義適用於單個文件,另一個可以跨多個文件應用。
隨着您的特定設置,如果您在多個C源文件的頭文件,然後試圖將它們鏈接在一起,你會得到鏈接錯誤,因爲每個對象文件具有變量的自己副本,他們「再所有試圖以出口爲主。
如果你希望你的變量是全球性的一個源文件,把它們在該源文件的頂部,並使其靜態(有效看不見的鏈接):
static int state;
這意味着每一個功能在那個文件可以得到他們,但他們不會干擾其他文件。
但是,如果你希望你的變量是在所有的源文件全球,放在一個頭文件中的聲明和在一個C源文件定義。一個聲明宣稱,雖然定義帶來了它進入存在的東西存在:
something.h:
extern int state; // declare it
file1.c:
#include "something.h" // declare it (in header)
int state; // AND define it.
// Now you can use state anywhere.
file2.c:
#include "something.h" // declare it (in header)
// Now you can use state anywhere.
這意味着有一個的state
的所有文件訪問副本。
就使用全局變量而言,通常應儘可能地避免。使用它們會使封裝變得更加困難,並使代碼的內部暴露於外部。
基本規則是使用盡可能小的範圍爲任何單個項目,仍然允許您達到目的。有時候,這意味着要傳遞信息。
如果你真的不想傳遞它們,至少要將所有數據和操作它的代碼隔離到一個文件中,以便你可以將它隱藏起來。
好的。謝謝。在我需要重寫代碼或發生大量錯誤之前,我只是想確定一下。 – Sams 2012-04-03 03:46:27
現在你知道它們是什麼了,明智地使用它們。不要僅僅爲了避免傳遞參數而使用它們。在有全局數據的情況下有意義使用它們(即需要一個實例並在很多地方引用)。全球數據存在*許多*下行風險。小心踩踏。 – 2012-04-03 03:56:59
但是,您不僅在頭文件中聲明瞭變量,還定義了它們。你不應該這樣做:如果有幾個模塊使用相同的hader,你會得到名稱衝突。 – Matthias 2012-04-03 03:57:08