C ++中的变量范围?

时间:2011-11-06 21:02:17

标签: c++ debugging error-handling scope

在c ++中,main中声明的所有变量都可以在主权中使用?我的意思是如果变量是在try循环中声明的,那么它们仍然可以在整个main中访问吗? 因为我在main中的try循环中声明了几个变量,但如果我在try循环外的main的任何其他部分使用它们,我会得到一个“未在此范围内声明”错误

我很遗憾无法发布我的实际代码,但这基本上就是我正在做的事情

int main()
{
   try 
   {
     int number = 0;
   }

   catch (...)
   {
     cout <<"Error";
   }

   number ++;
   cout <<number;

   return 0;
}

我基本上会在第13行和第14行得到一个错误,说这个范围内没有声明数字。

4 个答案:

答案 0 :(得分:7)

number的范围仅限于try块。将此声明拉出到main范围,以便在try块之后访问变量:

int main()
{
   int number = 0;
   try 
   {
     // do something...
   }

   catch (...)
   {
     cout <<"Error";
   }

   number ++;
   cout <<number;

   return 0;
}

答案 1 :(得分:6)

C ++中的局部变量具有块范围,而不是函数范围。变量number仅位于try块内的范围内。

为了使这项工作,你有(至少)两个选择:

  1. 在函数范围内使变量可访问(不太好):

    int main() {
        int number;
        try {
            number = <some possibly-exception-throwing call>;
        } catch (...) {
            cout << "Error\n";
            return 0;
        }
        ++number;
        cout << number;
    }
    
  2. 将所有变量放在try范围内(更好):

    int main() {
        try {
            int number = <some possibly-exception-throwing call>;
            ++number;
            cout << number;
        } catch (...) {
            cout << "Error\n";
        }
    }
    
  3. 我强烈赞成第二种选择,原因如下:

    1. 您不必明确处理变量未正确初始化的情况。
    2. 不存在意外使用未初始化变量的风险。实际上,如果C ++ locals具有函数作用域,那么你的代码就会精确地展示这个bug(假设意图是用一个比常量更有趣的东西初始化number)。
    3. 它保持声明和初始化。

    4. 附录:特别是main(),还有第三种选择:

          int main() try {
              ...
          } catch {
              cout << "Error\n";
          }
      

      这包括整个程序,包括main()之外的静态初始化程序,在try ... catch中。

答案 2 :(得分:1)

  

在c ++中,在main中声明的任何变量都将在整个过程中可用   主权?

没有!

每个变量的范围是定义变量的块及其嵌套块:{}

您必须将int number;放在try{}区块之外。


有关here的更多信息:

  

变量范围我们打算在a中使用的所有变量   程序必须在之前的类型说明符中声明   在代码中指向,就像我们在开头的前一个代码中所做的那样   当我们声明a,b和时,函数main的主体   结果是int类型。

     

变量可以是全局范围或本地范围。全局变量   是外部源代码主体中声明的变量   所有函数,而局部变量是在体内声明的变量   一个函数或一个块。

     

enter image description here

     

甚至可以从代码中的任何位置引用全局变量   内部函数,只要它在声明之后。

     

局部变量的范围仅限于所包含的块   大括号({})声明它们的位置。例如,如果它们被声明   在函数体的开头(如函数main)   它们的范围介于其声明点和结束之间   功能。在上面的例子中,这意味着如果是另一个函数   除了main之外,还存在main中声明的局部变量   无法从其他功能访问,反之亦然。

答案 3 :(得分:0)

这是正常的;每个{ ... }块标记一个新范围,在其中声明的变量是它的本地范围。如果您希望所有number中的main可用,请在try块之外声明它。