7
A
回答
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
的東西。
相關問題
- 1. dprintf隱式聲明警告
- 2. 警告:隱式聲明
- 3. sprintf_s()隱式聲明警告
- 4. 隱藏聲明
- 5. 警告:函數的隱式聲明'crypt_r'
- 6. 警告:函數的隱式聲明TableCreate
- 7. 警告:隱式聲明的錯誤
- 8. GLFW3:警告:隱式聲明函數「glGenBuffers」
- 9. 警告:函數隱式聲明
- 10. C警告隱式聲明函數'exit'
- 11. PHP全局聲明
- 12. NSInteger用於計算,警告'隱藏實例'的本地聲明
- 13. 警告:本地聲明的'mapView'隱藏實例變量
- 14. JSLint - 未聲明'jQuery'警告
- 15. 關於Python全局變量聲明的警告
- 16. 本地聲明隱藏實例變量警告
- 17. 本地聲明「x」隱藏實例變量xcode警告
- 18. 警告在Xcode:本地聲明隱藏實例變量
- 19. 聲明全局uiimages的NSMutablearray
- 20. 隱藏變量聲明VBA
- 21. 使用eclipse警告「字段聲明隱藏了另一個字段或變量」?
- 22. 聲明全局表格
- 23. C++全局對象聲明
- 24. 已聲明全局屬性
- 25. Python和全局聲明
- 26. 聲明全局變量
- 27. 全局變量聲明
- 28. 乳膠全局聲明
- 29. 在ASP.NET代碼隱藏聲明一個全局變量
- 30. Eclipse:未明確聲明全局變量
在編寫硬件驅動程序時(例如,自上次使用API以來硬件的最新配置),我經常使用全局變量作爲狀態信息(在配置結構中聚合在一起)。在這種情況下緩存這些信息通常是有利的/必要的。多年來,我聽到了無數使用全局變量的論據,但是你看到的其他「有效」用例呢? – sherrellbc
例如,請參閱[此處](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