C++中的变量范围?

use*_*485 0 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;
}
Run Code Online (Sandbox Code Playgroud)

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

Xio*_*ion 7

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

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

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

   number ++;
   cout <<number;

   return 0;
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*tos 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;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将所有变量放在try范围内(更好):

    int main() {
        try {
            int number = <some possibly-exception-throwing call>;
            ++number;
            cout << number;
        } catch (...) {
            cout << "Error\n";
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

我强烈赞成第二种选择,原因如下:

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

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

    int main() try {
        ...
    } catch {
        cout << "Error\n";
    }
Run Code Online (Sandbox Code Playgroud)

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