带有C++括号的范围

sch*_*ein 24 c++

是否有任何情况下将代码放在括号内以缩小其范围是我可能想要做的事情,或者这是你们会告诉我的那种情况之一,"如果你需要在你的代码中这样做,那么你的代码编写得很糟糕."

例如:

//***CODE****
{
  int foo=stuff;
  //use foo, and then I'm done using it forever
}
//****MORE CODE****
Run Code Online (Sandbox Code Playgroud)

Jam*_*lis 42

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

{
    std::lock_guard<std::mutex> lock(the_mutex);
    // use protected objects
}   // release the_mutex
Run Code Online (Sandbox Code Playgroud)

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

  • 你之后暗示它,但我认为应该是"使用这样的范围块**通常**表示你的代码需要重构".有时这在函数的"中间"是完全有效的,并且为了遵守某些严格的编码约定而将事物移到单独的函数中 - 是笨拙的,或者至多是乏味的._e.g._如果'临时'范围需要从外部范围访问许多变量,创建一个函数似乎没有意义,可能是一次性使用,并且遭受将所有需要的外部变量传递给它的麻烦/开销. (11认同)

Gil*_*aor 5

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

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


Rob*_*Rob 5

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


JBe*_*ley 5

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

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