变量被遮蔽时收到警告

我通常想避免这样的代码:

#include  int main(int argc, char *argv[]){ int n = 3; for (int n = 1; n <= 10; n++){ printf("%d\n", n); } printf("%d\n", n); } 

我怎样才能找到变量的这种用法? 这意味着,在同一函数中,“更本地”变量与更全局变量具有相同的名称?

C标准:C 99

gcc和clang都支持-Wshadow标志,该标志将警告相互影响的变量。 例如,我从gcc收到的代码警告如下:

 warning: declaration of 'n' shadows a previous local [-Wshadow] for (int n = 1; n <= 10; n++){ ^ warning: shadowed declaration is here [-Wshadow] int n = 3; ^ 

gcc在这里记录了这个标志并说:

每当局部变量或类型声明影响另一个变量,参数,类型,类成员(在C ++中)或实例变量(在Objective-C中)或内置函数被遮蔽时发出警告。 请注意,在C ++中,编译器会警告局部变量是否影响显式typedef,但如果它影响struct / class / enum则不会。

在Visual Studio中,这看起来像以前不可能,但似乎在最近的版本中修复 。

当我第一次看到它时,我对此表示怀疑,所以我必须亲自看看,你告诉我你不会马上得到这些警告吗?

这假设你正在使用没有-std编译器标志的gcc(C90模式)。

 rootavish@themachine /tmp $ gcc queer.c -oueer queer.c: In function 'main': queer.c:7:12: error: redefinition of 'n' for (int n = 1; n <= 10; n++){ ^ queer.c:5:7: note: previous definition of 'n' was here int n = 3; ^ queer.c:7:3: error: 'for' loop initial declarations are only allowed in C99 mode for (int n = 1; n <= 10; n++){ ^ queer.c:7:3: note: use option -std=c99 or -std=gnu99 to compile your code 

你可以指定编译器标志吗?