В C89 нельзя было просто выполнять int i;
где угодно; объявления действительны только в начале блоков.
Итак:
a = 1;
int i; /* error */
i = 2;
... недействительно, но
a = 1
if (e) {
int i;
... было нормально, как и простой блок.
Полученный стиль продолжался даже после того, как объявления стали действительными (C99) block-item (s), частично по инерции, частично для обратной переносимости, а также потому, что имеет смысл установить область для новых объявлений.
Для определения переменных. Например, переменная tmp_argv
будет действительна только между фигурными скобками.
Блок - это область, которая определяет время жизни переменных, а также их видимость для компилятора. Таким образом, переменные, которые создаются в блоке, исчезают, когда элемент управления выходит из блока.
Это может быть очень удобно, когда эти переменные являются экземплярами классов с конструкторами и деструкторами.
Однако в вашем примере нет большого преимущества.
Создается область действия. Объекты стека уничтожаются, когда они выходят за пределы области видимости. Похоже, что он что-то набирает, что означает, что каждый блок - это то, что они хотели отсрочить. Однако я не вижу никаких объектов таймера с заданной областью видимости, так что да, это не имеет смысла.
Другой случай использования для этого, который я недавно обнаружил, - это когда у вас есть семантика открытия / закрытия и вы хотите четко обозначить «внутренний» код:
f = fopen('file');
{
// do stuff
}
fclose(f);
Это хорошо работает, чтобы напомнить вам закрыть / освободить объекты, а a делает код несколько чище.
Переменные, которые вы объявляете внутри блока, являются локальными для этого блока. Таким образом, вы сможете переопределить tmp_argv
в другом месте вашего кода (ниже), не вступая в конфликт с этим фрагментом кода.
Это все? Возможно, программист использует tmp_argv
где-то еще в коде. Я не могу придумать никакой другой причины, поскольку tmp_argv
между {
и }
отделен от любых фигур, находящихся вне фигурных скобок.
Иногда я использую блоки в таких случаях: - Для локализации переменных - Или чтобы было легче читать ...
Хм - я, возможно, не в таблице, но я думаю, что определение локальной переменной внутри такого блока не будет действительным вне блока