警告:'index'的声明会影响全局声明

时间:2011-12-09 04:13:00

标签: c

我的编译器(gcc)显示警告

  

警告:声明'index'会影响全局声明

请帮助我理解为什么会出现此警告。

1 个答案:

答案 0 :(得分:24)

当您执行以下操作时:

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

警告的是index内的main()实际上是隐藏您在main()之前声明的全局

警告您,当本地定义为“活动”时,您无法获得全局定义。现在这不是必然一个问题(因此它只是一个警告),它是完全有效的C,但你需要意识到可能的后果。

  

顺便说一下,一些C实现(基于BSD)在index中定义了string.h 函数,这也可能导致问题。不推荐使用此函数,它不会出现在C标准中(改为使用strchr),但如果您正在运行(例如)Mac OS或OpenBSD(甚至是Mac OS或OpenBSD),它可能会导致问题我相信在#define设置的某种组合下的Linux。

有几种方法可以解决这个问题(如果需要)。

第一个可能是首选的:不要使用全局变量。是的,没错,摆脱它们。他们很少需要,所以不要让我过来为你拍打: - )

我看到的第二种方法是确保它们“打包”。假设您实际上需要全局变量(绝不是确定的,请参见上一段),创建一个包含它们的结构,如下所示:

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的局部变量。