带有C ++括号的范围

时间:2011-02-22 00:30:48

标签: c++

在任何情况下,将代码放在括号内以缩小其范围是我可能想要做的事情,或者这是你们要告诉我的那种情况之一,“如果你需要在你的代码,然后你的代码编写得很糟。“

例如:

//***CODE****
{
  int foo=stuff;
  //use foo, and then I'm done using it forever
}
//****MORE CODE****

5 个答案:

答案 0 :(得分:39)

是的,因为这样做的好处是该块中的任何局部变量都将在块的末尾被销毁。如果您想要尽快释放某种范围保护,例如,

,这将特别有用
{
    std::lock_guard<std::mutex> lock(the_mutex);
    // use protected objects
}   // release the_mutex

但请注意,使用这样的作用域块表示您的代码需要重构:块的内容通常可以拆分为单独的函数,可以对其进行命名和重用。

答案 1 :(得分:5)

例如,如果您使用RAII习语,这可能很有用。例如,同步锁定。

在大多数情况下,方法的范围应足够小以用于此类锁定。有时,您希望限制任一性能的锁定范围,或者避免向重构方法发送大量参数。但是,使用这个技巧不应该太常见。

答案 2 :(得分:5)

使用C ++可以做的所有事情,添加一个范围实际上是最不重要的。您拥有的代码没有任何问题,我有时会这样做(通常是为了确保本地人仅限于此案例)。根据用途,您可能会考虑将代码重构为单独的函数。

答案 3 :(得分:4)

我在自己的代码中找到了另一个用例:单元测试析构函数。使用UnitTest ++的示例(但无论单元测试框架如何,相同的原则都适用):

TEST(SomeTest)
{
   {
   SomeClass someObject;
   } // someObject is destroyed
   CHECK(isSomeClassDestructorWorking())
   // e.g. have all resources been freed up?
}

答案 4 :(得分:2)

另一个支架范围是有意义的是内部宏。例如,您可以定义一个宏,该宏声明可能与宏所在的代码块内的变量同名的变量。