我的编译器(gcc)显示警告
警告:声明'index'会影响全局声明
请帮助我理解为什么会出现此警告。
答案 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
的局部变量。