Почему кто-то использовал бы директиву препроцессору #if 1 C?

Я просматриваю некоторый исходный код 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? Разве это не верно, что только первый блок будет когда-либо обрабатываться?

16
задан Groo 4 October 2018 в 07:37
поделиться

7 ответов

Да ... Будет обрабатываться только первый блок --- пока кто-то не изменит 1 на 0. Затем будет скомпилирован другой блок. Это удобный способ временного включения и выключения блоков кода при тестировании различных алгоритмов.

21
ответ дан 30 November 2019 в 15:18
поделиться

Я добавляю это в свой код, когда мне нужно протестировать другой набор параметров. Обычно мой продукт поставляется с параметрами по умолчанию, отличными от тех, с которыми я могу работать в среде отладки, поэтому я помещаю значения по умолчанию для доставки в #if 1, а значения по умолчанию для отладки в #else с #warning, чтобы предупредить меня, что он создается с помощью отладки. по умолчанию.

5
ответ дан 30 November 2019 в 15:18
поделиться

Это еще один способ сказать, что для # if true , скорее всего, это результат кода, который ранее проверял наличие другого символа, а затем был реорганизован, чтобы он всегда был истинным.

1
ответ дан 30 November 2019 в 15:18
поделиться

Да. Только первый блок будет обрабатываться до тех пор, пока кто-то не изменит 1 на 0. Затем будет скомпилирован другой блок. Это удобный способ временного переключения блоков кода во время тестирования различных алгоритмов.

-121--2363376-

Возможно, ваш код правильный, попробуйте запустить его, например, с помощью valgrind и посмотрите, что там написано. Однако я бы написал это так:

for (ListNode *current = head, *next; current; current = next) {
    next = current->next;
    free(current);
}
-121--2672301-

Чтобы можно было быстро выбрать компилируемую часть, изменив значение # if 1 на # if 0 .

18
ответ дан 30 November 2019 в 15:18
поделиться

Одним из фундаментальных свойств программного обеспечения является то, что компьютерную программу дешево модифицировать.

Поэтому определенный код пишется таким образом, чтобы облегчить модификацию. Вот почему им нужны различные шаблоны, такие как "интерфейс", или "прокси".

И именно поэтому вы иногда видите странные конструкции вроде #if 1-#else-#endif, единственная цель которых - легко переключить часть кода, которая будет скомпилирована, небольшим усилием: заменив 1 на 0.

6
ответ дан 30 November 2019 в 15:18
поделиться

Для экспериментов с различными путями кода.

4
ответ дан 30 November 2019 в 15:18
поделиться

Это просто другой способ закомментировать большой кусок кода, поэтому автоматический отступ редактора не будет нарушать отступ (закомментированный блок кода будет с отступом как текст, а не как код).

3
ответ дан 30 November 2019 в 15:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: