我期待下面的变量var1的多个定义的错误消息(或至少警告)。这意味着这不是一个多重定义?变量的范围是否与main之外的范围不同。
#include <stdio.h>
int var1;
int main (void)
{
int var1;
var1=12;
printf("%d",var1);
}
答案 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函数的堆栈框架中。虽然合法,但你所做的事情通常不被视为良好做法,你应该避免它,除非你有充分的理由否则