我有这个东西:
使用gcc a.c -o a
// a.c
int main() {
int a;
if (1) {
int b;
}
b = 2;
}
在控制台中,我会遇到以下错误:
a.c:7:4: error: ‘b’ undeclared (first use in this function)
a.c:7:4: note: each undeclared identifier is reported only once for each function it appears in
C Ansi中声明的内部条件中的所有变量都将关闭到该范围?
答案 0 :(得分:6)
当然它必须抛出错误。
{
和}
大括号用于定义一个块,该块为块提供新的scope
。
因此,在范围之外定义或创建的所有内容都无法在该范围之外访问。
但是如果该块包含其他一些块,则可以访问块中外部作用域的成员。
即
int main()
{
int a;
{
int b;
{
int c;
b = c; // `b` is accessible in this innermost scope.
a = c; // `a` is also accessible.
}
// b = c; `c` is not accessible in this scope as it is not visible to the 2nd block
b = a; // `a` is visible in this scope because the outermost block encloses the 2nd block.
}
// a = b; outermost block doesn't know about the definition of `b`.
// a = c; obviously it is not accessible.
return 0;
}
并且,由于在{}
,if
,for
,while
和do-while
构造中使用了switch
,因此他们定义了一个新的data
使用时每个范围。
这是一个很好的机制,你可以在C
中限制definition/declaration
成员的可见性,其中{{1}}变量只允许在任何可执行语句之前的块开头遇到了。
答案 1 :(得分:3)
b是该条件范围的本地。为了使用它,您需要在循环之前声明它。最合乎逻辑的地方就是在函数的顶部。
答案 2 :(得分:0)
b
是if
块的局部变量,因为您已在if
块内的块(main()
)中定义了它。
除if
块之外,它不可见,这就是它给出错误的原因:b undeclared (first use in this function)
。在b
之后宣布a
(不必要)。
int a, b;
答案 3 :(得分:0)
您尚未声明变量b。 b是一个局部变量,你需要在主块内声明它。如果阻止,这将不适用于现场。
尝试这样的事情: -
int main() {
int a;
int b;
if (1) {
//....
}
b = 2;
}