Подтвердить что ты не робот

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

4b9b3361

Ответ 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

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