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



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



//do some stuff . . .
fprintf(stderr, "%.2f secn", (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 secn", (float)(clock() - t) / CLOCKS_PER_SEC);
}


зачем вставлять такие блоки в код? Там их полным-полно. Есть ли какое-то преимущество в производительности? Какая-то мистическая вещь C? Зачем???



edit:этот код если из BWA, программа биоинформатики, которая выравнивает небольшие последовательности на большие ссылки на них с помощью Burrows-Wheeler transform, если вам интересно. Этот пример кода не имеет особого отношения к функциональности приложения.

751   9  

9 ответов:

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

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

так:

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

...не было действительным, но

a = 1
if (e) {
  int i;

...все было в порядке, как и обычный блок.

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

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

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

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

однако, в вашем примере нет большого преимущества.

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

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

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

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

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

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

Я иногда использую блоки в этих случаях: - Для локализации переменных - Или чтобы легче читать ...

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

Comments

    Ничего не найдено.