2016-05-04 92 views
2
static uint32_t a[20] = {0}; 

是什麼區別靜態和非靜態全局

uint32_t a[20] = {0}; 

我在代碼

a[0] = 1; 

等使用這兩者....

當我製作變量static並使用它時,出現錯誤

variable "a" was declared but never referenced 

但是當我刪除static事情工作正常。

在這兩種情況下,數組a是全球性的。

錯誤是與MACROS。

數組聲明已完成,它由某個平臺使用,我沒有看到有關該錯誤的信息。相同的代碼會提供錯誤,因爲此聲明/數組未在其他平臺上使用。

我的不好!

static uint32_t a[20] = {0}; 
void func() 
{ 
............... 
    #ifdef ABC 

    a[0] = 1; 

    #endif 
................ 
} 

現在在平臺ABC上編譯沒有錯誤編譯在某些非ABC平臺上有錯誤。

解決方案:環繞全球還根據各宏

#ifdef ABC 
static uint32_t a[20] = {0}; 
#endif 
+0

'static'的意思是「這個變量不是_directly_可訪問的單元/文件之外」,但我不明白你爲什麼會收到這樣的錯誤 –

+0

如果你得到一個錯誤,聲明一個變量但從未引用,賠率是你宣佈它但從未引用它。 (也許你引用了一個具有相同名稱的變量。) –

+0

@DavidSchwartz是的,我想知道什麼是錯的。我在我的代碼中使用它相同的數組。 – Gopi

回答

4

的主要區別是,當定義爲static,陣列的範圍僅限於翻譯單元,而,不帶靜電,在範圍不限於翻譯單元。

引用C11,章§6.2.2

如果一個文件範圍標識符的對象或功能的聲明中包含的存儲類 說明符static,所述標識符具有內部連接。

所以,在static全球的情況下,你不能使用,翻譯單元的變量之外。

+0

請您詳細說明一下嗎? – Gopi

+2

@Gopi你能解釋一下哪些問題還不清楚或者你需要闡述什麼? –

+0

這是一篇關於[C++中的靜態變量]的文章(http://stackoverflow.com/questions/3698043/static-variables-in-c) - 它在C中是否一樣? – user3078414

0

關鍵字static

情況1:當使用file scope

實施例:

static int x=0; // declared outside main() and all functions 

意味着該變量只能在翻譯單元被使用,即,文件,該文件包含它。

所以你不能做

extern int x; // from another file 

案例2:block scope

使用實例

somefunction() 
{ 
static int x=0; 
x++; // x acting as a counter here 
} 

變量x逗留期間提供不同的投入(或者它不會重新初始化)函數的調用。您可以將其用作函數變量,例如,作爲計數器來查找函數被調用的次數。範圍僅限於功能塊。


關於警告:

變量「a」被聲明但從未引用

當它斷章取義分配自動變量的內存被釋放。但靜態變量不是這種情況。他們一直堅持到執行結束。如果你不使用靜態變量,編譯器可能會提醒你關於這個 - 我猜 - 這樣你可以避免這樣的聲明。

相關問題