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