繁体   English   中英

C ++中的可变范围?

[英]Variable Scope in C++?

在c ++中,在main中声明的任何变量在整个main权限中都可用吗? 我的意思是,如果变量在try循环中声明,它们是否仍可在整个main中访问? 因为我已经在main的try循环中声明了几个变量,但是如果在try循环之外的main的任何其他部分中使用了它们,则会收到“未在此范围内声明”错误

不幸的是,我无法发布我的实际代码,但这基本上是我正在做的事情

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

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

   number ++;
   cout <<number;

   return 0;
}

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

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

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

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

   number ++;
   cout <<number;

   return 0;
}

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"; } } 

我出于某些原因强烈支持第二种选择:

  1. 您不必显式处理变量未正确初始化的情况。
  2. 没有意外使用未初始化变量的风险。 实际上,如果C ++本地人具有函数作用域(假设目的是用比常量更有趣的number初始化number ,则您的代码将恰好显示此错误。
  3. 它使声明和初始化保持在一起。

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

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

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

在c ++中,在main中声明的任何变量在整个main权限中都可用吗?

没有!

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

您必须输入int number; try{}块之外。


这里更多:

变量的范围我们打算在程序中使用的所有变量必须已在代码的较早位置用其类型说明符声明,就像我们在声明时在函数main主体开头处在上一代码中所做的一样a,b和结果均为int类型。

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

在此处输入图片说明

全局变量可以在代码声明后的任何地方(甚至在函数内部)引用。

局部变量的范围仅限于在大括号({})中声明的地方。 例如,如果在函数主体的开头声明它们(如在函数main中),则它们的范围在其声明点和该函数的结尾之间。 在上面的示例中,这意味着如果除main之外还存在另一个函数,则无法从另一个函数访问main中声明的局部变量,反之亦然。

那很正常 每个{ ... }块都标记一个新作用域,并且在其中声明的变量是局部的。 如果您希望number在所有main中都可用,请在try块外声明它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM