Зачем заключать блоки кода C в фигурные скобки?

Я смотрю на некоторый код С и заметил, что он заполнен этими фигурными скобками, окружающими блоки кода без какой-либо структуры управления. Посмотрите: см.

//do some stuff . . . fprintf(stderr, "%.2f sec\n", (float)(clock() - t) / CLOCKS_PER_SEC); { //a block! why not? char *tmp_argv[3]; tmp_argv[0] = argv[0]; tmp_argv[1] = str; tmp_argv[2] = prefix; t = clock(); fprintf(stderr, "[bwa_index] Convert nucleotide PAC to color PAC... "); bwa_pac2cspac(3, tmp_argv); fprintf(stderr, "%.2f sec\n", (float)(clock() - t) / CLOCKS_PER_SEC); } 

Зачем вы вставляете такие блоки в код? Он наполнен ими. Есть ли какая-то производительность? Что-то мистическое С? Зачем???

edit: Этот код, если из BWA , программа биоинформатики, которая выравнивает небольшие последовательности с большими ссылочными, используя преобразование Берроуза-Уилера , в случае, если вам было интересно. Этот пример кода не имеет особого отношения к функциональности приложения.

Устаревший код необходим {}, чтобы делать объявления вообще

В C89 вы не могли просто делать int i; в любом месте; объявления были действительны только в начале блоков.

Так:

 a = 1; int i; /* error */ i = 2; 

… недействительно, но

 a = 1 if (e) { int i; 

… было прекрасно, как и простой блок.

Результирующий стиль продолжался даже после того, как декларации стали действительными (C99) блок-элементами , частично по инерции, частично для обратной переносимости, а также потому, что имеет смысл установить область для новых объявлений.

Переменные области. Например, переменная tmp_argv будет действительна только между фигурными скобками.

Блок – это область, определяющая время жизни переменных, а также их видимость для компилятора. Таким образом, переменные, которые создаются внутри блока, уходят, когда управление выходит из блока.

Это может быть очень удобно, когда эти переменные являются экземплярами classов с конструкторами и деструкторами.

Однако в вашем примере не так много преимуществ.

Он создает область действия. Объекты стека уничтожаются, когда они выходят за frameworks. Похоже, что он делает какую-то типизацию, что означало бы, что каждый блок – это то, что они хотели. Тем не менее, я не вижу никаких объектов с таймером, поэтому да, не имеет смысла.

Переменные, которые вы объявляете внутри блока, являются локальными для этого блока. Таким образом, вы можете переопределить tmp_argv в другом месте вашего кода (ниже), не противоречив этому fragmentу кода.

Еще один случай использования, который я недавно обнаружил, – это когда у вас есть открытая / закрытая семантика, и вы хотите четко обозначить «внутренний» код:

 f = fopen('file'); { // do stuff } fclose(f); 

Это хорошо работает, чтобы напомнить вам закрыть / освободить объекты и сделать код несколько более чистым.

Это все? Возможно, программист использует tmp_argv где-то еще в коде. Я не могу думать ни о какой другой причине, так как tmp_argv между { и } отделен от любых внешних фигур.

Я иногда использую блоки в этих случаях: – Локализовать переменные – Или, чтобы читать легче …

Хм – я, может быть, здесь, но я думаю, что локальная переменная, определяемая внутри такого блока, не будет действительна вне блока

Давайте будем гением компьютера.