在任何情况下,将代码放在括号内以缩小其范围是我可能想要做的事情,或者这是你们要告诉我的那种情况之一,“如果你需要在你的代码,然后你的代码编写得很糟。“
例如:
//***CODE****
{
int foo=stuff;
//use foo, and then I'm done using it forever
}
//****MORE CODE****
答案 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)
另一个支架范围是有意义的是内部宏。例如,您可以定义一个宏,该宏声明可能与宏所在的代码块内的变量同名的变量。