Зачем заключать блоки кода 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, программа биоинформатики, которая выравнивает небольшие последовательности с большими ссылочными используя преобразование Burrows-Wheeler, если вам интересно. Этот пример кода не имеет особого отношения к функциональности приложения.
Ответы
Ответ 1
Необходимый код устаревшего кода {}, чтобы делать объявления вообще
В C89 вы не могли просто сделать int i;
в любом месте; объявления были действительны только в начале блоков.
Итак:
a = 1;
int i; /* error */
i = 2;
... недействителен, но
a = 1
if (e) {
int i;
... было прекрасно, как и обычный блок.
Результирующий стиль продолжался даже после того, как декларации стали действительными (C99) блок-элементами, частично по инерции, частично для обратной переносимости, а также потому, что имеет смысл установить область для новых объявлений.
Ответ 2
Переменные области. Например. переменная tmp_argv
будет действительна только между фигурными скобками.
Ответ 3
Блок - это область, определяющая время жизни переменных, а также их видимость для компилятора. Таким образом, переменные, которые создаются внутри блока, уходят, когда управление выходит из блока.
Это может быть очень удобно, когда эти переменные являются экземплярами классов с конструкторами и деструкторами.
Однако в вашем примере не так много преимуществ.
Ответ 4
Он создает область видимости. Объекты стека уничтожаются, когда они выходят за рамки. Похоже, что он делает какую-то типизацию, что означало бы, что каждый блок - это то, что они хотели. Тем не менее, я не вижу никаких объектов с таймером, поэтому да, не имеет смысла.
Ответ 5
Переменные, которые вы объявляете внутри блока, являются локальными для этого блока. Таким образом, вы можете переопределить tmp_argv
в другом месте вашего кода (ниже), не противоречая этой части кода.
Ответ 6
Еще один пример использования, который я недавно обнаружил, - это когда у вас есть открытая/закрытая семантика, и вы хотите четко обозначить внутренний код:
f = fopen('file');
{
// do stuff
}
fclose(f);
Это хорошо работает, чтобы напомнить вам закрыть/освободить объекты и сделать код несколько более чистым.
Ответ 7
Это все? Может быть, программист использует tmp_argv
где-то еще в коде. Я не могу думать ни о какой другой причине, так как tmp_argv
между {
и }
отделен от любых внешних фигур.
Ответ 8
Я иногда использую блоки в этих случаях:
- Чтобы локализовать переменные
- Или проще читать
...
Ответ 9
Хмм - Я, может быть, здесь не на карте, но я думаю, что локальная переменная, определяемая внутри такого блока, не будет действительна вне блока