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

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

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

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

这是你做的事情:

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

它的警告是main()中的index实际上隐藏了你在main()之前声明的全局index

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

顺便说一下,一些C实现(基于BSD)在string.h定义了一个index 函数 ,这也可能导致问题。 不推荐使用此函数,它不会出现在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  #include "myglobs.h" int main (void) { myGlobs.index = 42; return 0; } 

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