C Ansi内存分配关闭

时间:2013-08-12 16:00:11

标签: c scope

我有这个东西:

使用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中声明的内部条件中的所有变量都将关闭到该范围?

4 个答案:

答案 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;
}

并且,由于在{}ifforwhiledo-while构造中使用了switch,因此他们定义了一个新的data使用时每个范围。

这是一个很好的机制,你可以在C中限制definition/declaration成员的可见性,其中{{1}}变量只允许在任何可执行语句之前的块开头遇到了。

答案 1 :(得分:3)

b是该条件范围的本地。为了使用它,您需要在循环之前声明它。最合乎逻辑的地方就是在函数的顶部。

答案 2 :(得分:0)

bif块的局部变量,因为您已在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;
}