Я просматриваю некоторый исходный код C, и я не понимаю следующую часть
#if 1
typedef unsigned short PronId;
typedef unsigned short LMId;
# define LM_NGRAM_INT
#else
typedef unsigned int LMId;
typedef unsigned int PronId;
# undef LM_NGRAM_INT
#endif
Почему кто-то сделал бы #if 1
? Разве это не верно, что только первый блок будет когда-либо обрабатываться?
Да ... Будет обрабатываться только первый блок --- пока кто-то не изменит 1 на 0. Затем будет скомпилирован другой блок. Это удобный способ временного включения и выключения блоков кода при тестировании различных алгоритмов.
Я добавляю это в свой код, когда мне нужно протестировать другой набор параметров. Обычно мой продукт поставляется с параметрами по умолчанию, отличными от тех, с которыми я могу работать в среде отладки, поэтому я помещаю значения по умолчанию для доставки в #if 1, а значения по умолчанию для отладки в #else с #warning, чтобы предупредить меня, что он создается с помощью отладки. по умолчанию.
Это еще один способ сказать, что для # if true , скорее всего, это результат кода, который ранее проверял наличие другого символа, а затем был реорганизован, чтобы он всегда был истинным.
Да. Только первый блок будет обрабатываться до тех пор, пока кто-то не изменит 1 на 0. Затем будет скомпилирован другой блок. Это удобный способ временного переключения блоков кода во время тестирования различных алгоритмов.
-121--2363376-Возможно, ваш код правильный, попробуйте запустить его, например, с помощью valgrind и посмотрите, что там написано. Однако я бы написал это так:
for (ListNode *current = head, *next; current; current = next) {
next = current->next;
free(current);
}
-121--2672301- Чтобы можно было быстро выбрать компилируемую часть, изменив значение # if 1
на # if 0
.
Одним из фундаментальных свойств программного обеспечения является то, что компьютерную программу дешево модифицировать.
Поэтому определенный код пишется таким образом, чтобы облегчить модификацию. Вот почему им нужны различные шаблоны, такие как "интерфейс", или "прокси".
И именно поэтому вы иногда видите странные конструкции вроде #if 1
-#else
-#endif
, единственная цель которых - легко переключить часть кода, которая будет скомпилирована, небольшим усилием: заменив 1 на 0.
Это просто другой способ закомментировать большой кусок кода, поэтому автоматический отступ редактора не будет нарушать отступ (закомментированный блок кода будет с отступом как текст, а не как код).