使用宏并考虑以下场景。在已经存在于调用此宏的函数中的宏中声明变量,为什么编译器不会抱怨。当我在代码中声明一个变量时,它会给我一个警告:
重新定义' temp'
我认为它的预期行为必须在标准(ANSI C)中记录,但无法找到。
例如这段代码:
#define TEST() { \
int temp = 10; \
}
int main() {
int temp = 999;
printf("\ntemp: %d", temp);
TEST();
printf("\ntemp: %d", temp);
}
答案 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。