当我在函数中已存在的宏中声明具有相同名称的变量时,为什么不收到警告?

时间:2015-06-20 17:29:52

标签: c macros ansi

使用宏并考虑以下场景。在已经存在于调用此宏的函数中的宏中声明变量,为什么编译器不会抱怨。当我在代码中声明一个变量时,它会给我一个警告:

  

重新定义' temp'

我认为它的预期行为必须在标准(ANSI C)中记录,但无法找到。

例如这段代码:

#define TEST() { \
    int temp = 10; \
}

int main() {

    int temp = 999;

    printf("\ntemp: %d", temp);
    TEST();
    printf("\ntemp: %d", temp);
}

2 个答案:

答案 0 :(得分:2)

宏扩展为一个块。块内是一个单独的作用域,您可以在其中声明与外部同名的变量。它们会影响外部变量。这样做通常不是一个好主意。

答案 1 :(得分:2)

鉴于您的代码和上面的宏,C preprocessor会生成以下内容:

int main() {

  int temp = 999;

  printf("\ntemp: %d", temp);
  { 
    int temp = 10; 
  }
  printf("\ntemp: %d", temp);
}

这是C编译器接收的代码。

内部{ .. }称为nested scope。在您的情况下,这个嵌套的内部范围包含一个变量temp,其中已经有一个在外围范围(variable shadowing)中。这会触发您所看到的警告。

注意:在您的特定示例中,temp变量在嵌套范围内声明,从未使用过,并且范围关闭从而删除该变量。它基本上是NOP