Область с скобками в С++

Есть ли какой-либо случай, когда класть код внутри скобок для сокращения своей области действия - это то, что я могу сделать, или это один из тех случаев, когда вы, ребята, скажете мне: "Если вам нужно сделать это в своем кода, то ваш код плохо написан."

Например:

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

Ответ 1

Да, поскольку это имеет то преимущество, что любые локальные переменные в этом блоке будут уничтожены в конце блока. Это особенно полезно, если у вас есть какая-то защита области, которую вы хотите выпустить как можно скорее, например,

{
    std::lock_guard<std::mutex> lock(the_mutex);
    // use protected objects
}   // release the_mutex

Обратите внимание, однако, что использование такого блока видимости указывает на то, что ваш код необходимо реорганизовать: содержимое блока обычно можно разделить на отдельную функцию, которую можно назвать и использовать повторно.

Ответ 2

Например, если вы используете идиому RAII, это может быть полезно. Например, блокировки синхронизации.

В большинстве случаев объем метода должен быть достаточно мал для таких блокировок. Бывают случаи, когда вы хотите ограничить область блокировки как для производительности, так и для того, чтобы не отправлять параметры gazillion в рефакторированный метод. Однако использование этого трюка не должно быть слишком распространенным.

Ответ 3

Со всеми вещами, которые вы можете сделать на С++, добавление области действительно будет наименьшим из них. Нет ничего плохого в коде, который у вас есть, я делаю это иногда (часто в случае, чтобы локальные жители ограничивались случаем). В зависимости от использования вам может понравиться думать о реорганизации кода в отдельную функцию.

Ответ 4

Я нашел другой вариант использования в моем собственном коде: деструкторы тестирования модулей. Пример использования UnitTest ++ (но тот же принцип применяется независимо от рамки модульного тестирования):

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

Ответ 5

Еще одно определение области скобок имеет смысл внутри макросов. Например, вы можете определить макрос, который объявляет переменные потенциально того же имени, что и переменные внутри блока кода, в которые помещается макрос.