Область с скобками в С++
Есть ли какой-либо случай, когда класть код внутри скобок для сокращения своей области действия - это то, что я могу сделать, или это один из тех случаев, когда вы, ребята, скажете мне: "Если вам нужно сделать это в своем кода, то ваш код плохо написан."
Например:
//***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
Еще одно определение области скобок имеет смысл внутри макросов. Например, вы можете определить макрос, который объявляет переменные потенциально того же имени, что и переменные внутри блока кода, в которые помещается макрос.