2010-02-15 3 views
13

Я просматривал C исходный код, и я не понимаю, следующая частьЗачем кому-то использовать директиву препроцессора #if 1 C?

#if 1 
typedef unsigned short PronId;    /* uniquely identifies (word,pron) pair, i.e. 
            homophones have different Ids */ 
typedef unsigned short LMId; 
#define LM_NGRAM_INT 
#else 
typedef unsigned int LMId; 
typedef unsigned int PronId; 
#undef LM_NGRAM_INT 
#endif 

Зачем кому-то делать #if 1? Не правда ли, что только первый блок будет обработан?

+2

'PronId'? Является ли этот код для сайта, ориентированного на взрослых? – Thomas

+0

@ Томас Хорошо заметил! – Fuzz

+2

@Thomas Нет, это сокращение от идентификатора объявления в приложении распознавания речи –

ответ

17

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

4

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

17

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

1

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

5

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

5

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

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

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

+0

Мне нравится цитата: 'Компьютерная программа дешево модифицировать' – nmxprime

3

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

1

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

0

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

#if ALGO1 

#else 

#endif 

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

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