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

Ang*_*gus 7 c

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

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

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

pax*_*blo 25

这是你做的事情:

int index;
int main (void) {
    int index;
    ....
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它的警告是index内部main()实际上隐藏了你之前声明过的全局内容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;
    }
Run Code Online (Sandbox Code Playgroud)

这样做的好处在于,显然你指的是全局,并且它们永远不会被隐藏,除非你做一些像定义你自己的局部变量一样的东西myGlobs.