【问题标题】:Warning for variable Multiple Definition变量多重定义的警告
【发布时间】:2015-10-07 17:44:41
【问题描述】:

我期待下面变量 var1 的多个定义的错误消息(或至少警告)。这意味着这不是多重定义吗?变量在 main 内部的作用域是否与它在 main 外部的作用域不同。

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

【问题讨论】:

标签: c mingw codeblocks


【解决方案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);
}

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2022-01-15
        • 2023-01-11
        • 1970-01-01
        • 1970-01-01
        • 2023-04-11
        • 1970-01-01
        • 2021-12-01
        • 2012-07-29
        • 1970-01-01
        相关资源
        最近更新 更多