2011-12-09 109 views

回答

23

這是當你做這樣的事情:

int index; 
int main (void) { 
    int index; 
    .... 
    return 0; 
} 

什麼它是警告的是裏面main()index實際上是隱藏main()之前已經聲明瞭全球性的。

這是警告你,你不能在全局定義,而本地的是「活躍」。現在這不是必然一個問題(因此它爲什麼只是一個警告),它是完全有效的C,但你需要意識到可能的後果。

順便說一句,一些C實現(基於BSD)定義index功能string.h這也可能引起問題。此功能的使用已過時,並未出現在C標準中(使用strchr代替),但如果您正在運行(例如)Mac OS或OpenBSD(或甚至某些組合的Linux),則可能導致問題的原因我相信#define設置)。

有幾種方法可以解決這個問題(如果需要的話)。

第一個可能是首選的:不要使用全局變量。是的,沒錯,擺脫它們。他們是非常少需要的,所以不要讓我過來並拍打你:-)

我見過的第二種方法是確保它們「打包」。假設你實際上需要全局(絕非板上釘釘,見前段),創建一個保存它們的結構,如在以下幾點:

myglobs.h: 
    struct sMyGlobs { 
     int index; 
     // all other globals. 
    }; 
    extern struct sMyGlobs myGlobs; 

myglobs.c: 
    #include "myglobs.h" 
    struct sMyGlobs myGlobs; 

main.c: 
    #include <stdio.h> 
    #include "myglobs.h" 
    int main (void) { 
     myGlobs.index = 42; 
     return 0; 
    } 

這有它的明顯的優勢,你指的是一個全球性的,而且他們永遠不會被隱藏,除非你做一些像定義你自己的局部變量myGlobs的東西。

+0

在編寫硬件驅動程序時(例如,自上次使用API​​以來硬件的最新配置),我經常使用全局變量作爲狀態信息(在配置結構中聚合在一起)。在這種情況下緩存這些信息通常是有利的/必要的。多年來,我聽到了無數使用全局變量的論據,但是你看到的其他「有效」用例呢? – sherrellbc

+0

例如,請參閱[此處](https://github.com/sherrellbc/mock-OS/blob/periph_cmos_dev/mock/kernel/arch/i386/irq/irq_core/pic8259.c#L119-L123)或[here ](https://github.com/sherrellbc/mock-OS/blob/periph_cmos_dev/mock/kernel/arch/i386/irq/cmos/cmos.c#L134-L138)和[here](https:// github .COM/sherrellbc /模擬OS/BLOB/periph_cmos_dev /模擬/內核/弓/ I386/IRQ/CMOS/cmos.c#L115-L121)。他們仍然在進行中。在這種情況下,我需要在異步中斷處理程序中使用狀態信息。可以說這樣的事情不能做_without_ globals。它一如既往依賴於上下文。 – sherrellbc