2

我有这个东西:

编译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

4 回答 4

6

当然它必须抛出一个错误。

{和大}括号用于定义一个块,该块为该块提供一个新的scope. 因此,在一个范围内定义或创建的所有东西都不能在该范围之外访问。

但是,如果该块包含其他一些块,则您可以访问该块中外部范围的成员。

IE

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's 、、for和构造中使用,它们在使用时为它们中的每一个定义了一个新的范围。whiledo-whileswitch

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

于 2013-08-12T16:13:22.940 回答
3

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

于 2013-08-12T16:04:20.213 回答
0

b是要阻塞的局部变量if,因为您已经在块if内的块 ( )中定义了它main()。它在此块之外不可见if,这就是它给出错误的原因:b undeclared (first use in this function). b紧随其后声明a(非必要)。

int a, b;  
于 2013-08-12T16:03:03.207 回答
0

您尚未声明变量 b。b 是一个局部变量,您需要在主块中声明它。如果阻塞,这将无法在外部工作。

尝试这样的事情: -

int main() {
    int a;
    int b;   
    if (1) { 
        //....
    }
    b = 2;
} 
于 2013-08-12T16:03:28.727 回答