变量多重定义的警告

时间:2015-10-07 17:44:42

标签: c mingw codeblocks

我期待下面的变量var1的多个定义的错误消息(或至少警告)。这意味着这不是一个多重定义?变量的范围是否与main之外的范围不同。

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

3 个答案:

答案 0 :(得分:1)

  

main中变量的范围是否与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);
}

答案 1 :(得分:1)

不,它不是多个定义,因为它们在不同的范围内。在main()的范围内,您有一个不同的变量。通常,外部作用域中的变量在内部作用域中也是活跃的,但是具有相同名称的变量 shadow 外部作用域的变量。

尽管如此,它通常只是糟糕的做法,因为它很容易导致错误具有多个同名变量。编译器可能试图检测到这一点并对其发出警告,但这可能会导致许多误报,因为它毕竟是合法的,有时会有很好的用途。

编辑:正如cremno在评论中指出的那样,GCC(以及mingw)能够使用标志-Wshadow显示此类警告。

答案 2 :(得分:0)

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

您在Main函数中声明的变量int var1位于运行Main函数的堆栈框架中。虽然合法,但你所做的事情通常不被视为良好做法,你应该避免它,除非你有充分的理由否则