Зачем заключать блоки кода 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, если вам интересно. Этот пример кода не имеет особого отношения к функциональности приложения.
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