变量多重定义警告

Warning for variable Multiple Definition

我期待以下变量 var1 的多重定义的错误消息(或至少是警告)。这意味着这不是多重定义吗? main里面的变量作用域和main外部的作用域是不是不一样

#include <stdio.h>
int var1;
int main (void)
{
    int var1;
    var1=12;
    printf("%d",var1);
}

Is the scope of the variable inside the main is different from its scope outside the main.

是的。它们是两个不同的变量。因此,不存在多变量定义错误。

使用以下程序验证它:

#include <stdio.h>

int var1;
void foo();

int main (void)
{
    int var1;
    var1=12;
    printf("%d\n",var1);
    foo();
}

void foo()
{
    var1=20;
    printf("%d\n",var1);
}

不,这不是多重定义,因为它们在不同的范围内。在 main() 的范围内,您有一个不同的变量。通常,来自外部作用域的变量在内部作用域中也是有效的,但是有一个同名变量 shadows 外部作用域的变量。

也就是说,这通常只是 不好的做法,因为它很容易导致具有多个同名变量的错误。编译器 可以 尝试检测并警告它,但这可能会导致许多误报,因为它毕竟是合法的,有时还有很好的用途。

编辑:正如 cremno 在评论中指出的那样,GCC(以及 mingw)能够使用标志 -Wshadow.

显示此类警告

正如其他人所说,就编译器而言,这些是不同的变量。在 main 函数之外声明的 int var1 存在于全局范围内,程序中的所有函数都可以访问它(在同一文件或其他使用 extern 编译和链接在一起的文件中声明)。

您在 Main 函数中声明的变量 int var1 位于您的 Main 函数所在的堆栈帧中 运行。虽然合法,但您所做的通常不被认为是好的做法,除非您有充分的理由,否则您应该避免这样做