变量被遮蔽时获取警告

时间:2014-08-06 02:53:49

标签: c variables warnings c99

我一般都想避免这样的代码:

#include <stdio.h>

int main(int argc, char *argv[]){

  int n = 3;

  for (int n = 1; n <= 10; n++){
    printf("%d\n", n);
  }

  printf("%d\n", n);
}

如何找到变量的这种用法?这意味着,在同一个功能中,更多的本地&#34;变量与更全局变量的名称相同吗?

C-Standard:C 99

2 个答案:

答案 0 :(得分:12)

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记录了国旗here并说:

  

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

在Visual Studio中,这似乎不可能在seems to be fixed in recent versions之前完成。

答案 1 :(得分:0)

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

这假设您正在使用带有-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

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