Зачем кому-то использовать директиву препроцессора #if 1 C? - PullRequest
15 голосов
/ 15 февраля 2010

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

Ответы [ 9 ]

20 голосов
/ 15 февраля 2010

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

17 голосов
/ 15 февраля 2010

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

6 голосов
/ 15 февраля 2010

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

Вот почему определенный код написан таким образом, чтобы облегчить изменение. Вот почему им нужны различные шаблоны, такие как «интерфейс» или «прокси».

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

5 голосов
/ 15 февраля 2010

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

4 голосов
/ 15 февраля 2010

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

3 голосов
/ 11 апреля 2010

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

2 голосов
/ 31 июля 2013

Я на самом деле использую его как ключ, чтобы упростить свертывание кода;если я оберну часть кода в #if 1 ... #endif, я могу сложить его в своем редакторе.(Код, о котором идет речь, очень тяжелый и не написан мной, поэтому более традиционные способы сделать огромный блок кода управляемым не сработают.)

1 голос
/ 31 июля 2013

Более чистый способ сделать это, вероятно, сделать что-то вроде:

#if ALGO1

#else

#endif

Но вам придется передать в ALGO1 аргументы компилятора где-нибудь ... например, в make-файле, вам нужноadd -DALGO1 = 1 (если 1 не указано, предполагается 1).Ссылка: http://www.amath.unc.edu/sysadmin/DOC4.0/c-compiler/user_guide/cc_options.doc.html

Это больше работы ... поэтому, как правило, для быстрых проверок используется #if 1.А в некоторых случаях забываются и остаются позади: -)

1 голос
/ 15 февраля 2010

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

...