2011-12-09 83 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