В C / C ++
Что происходит с кодом, помещенным между блоком #if 0
/ #endif
?
#if 0
//Code goes here
#endif
Код просто пропускается и, следовательно, не выполняется?
В C / C ++
Что происходит с кодом, помещенным между блоком #if 0
/ #endif
?
#if 0
//Code goes here
#endif
Код просто пропускается и, следовательно, не выполняется?
Ответы:
Он не только не выполняется, он даже не компилируется.
#if
- это команда препроцессора, которая оценивается перед фактическим шагом компиляции. Код внутри этого блока не отображается в скомпилированном двоичном файле.
Он часто используется для временного удаления сегментов кода с намерением включить их позже.
Это идентично закомментированию блока, за исключением одного важного различия: вложение не является проблемой. Рассмотрим этот код:
foo();
bar(x, y); /* x must not be NULL */
baz();
Если я хочу это прокомментировать, я могу попробовать:
/*
foo();
bar(x, y); /* x must not be NULL */
baz();
*/
Bzzt. Ошибка синтаксиса! Зачем? Поскольку блочные комментарии не вкладываются, и поэтому (как вы можете видеть из выделения синтаксиса SO) */
после слова «NULL» комментарий завершается, и baz
вызов не закомментирован, а */
после baz
- синтаксическая ошибка. С другой стороны:
#if 0
foo();
bar(x, y); /* x must not be NULL */
baz();
#endif
Работает, чтобы закомментировать все это. И #if 0
s будут гнездиться друг с другом, например:
#if 0
pre_foo();
#if 0
foo();
bar(x, y); /* x must not be NULL */
baz();
#endif
quux();
#endif
Хотя, конечно, это может немного сбить с толку и стать головной болью при обслуживании, если не прокомментировать должным образом.
foo.c:3: unterminated string or character constant
от gcc, что ты используешь?
Что именно делает блок #if 0… #endif?
Это говорит вам, что автор, очевидно, никогда не слышал о системе контроля версий. Что, в свою очередь, говорит вам бежать как можно дальше ...
Хочу добавить по #else
делу:
#if 0
/* Code here will NOT be complied. */
#else
/* Code will be compiled. */
#endif
#if 1
/* Code will be complied. */
#else
/* Code will NOT be compiled. */
#endif
Когда препроцессор видит #if, он проверяет, имеет ли следующий токен ненулевое значение. Если это так, он сохраняет код для компилятора. Если это не так, он избавляется от этого кода, поэтому компилятор никогда его не видит.
Если кто-то говорит #if 0, они фактически комментируют код, поэтому он никогда не будет скомпилирован. Вы можете думать об этом так же, как если бы они поместили вокруг него / * ... * /. Это не совсем то же самое, но имеет тот же эффект.
Если вы хотите подробно разобраться в произошедшем, можете часто посмотреть. Многие компиляторы позволяют просматривать файлы после запуска препроцессора. Например, в Visual C ++ команда switch / P выполнит препроцессор и поместит результаты в файл .i.
#if WIN32 || __CYGWIN__
но это работает должным образом.
Строки, начинающиеся с a, #
являются директивами препроцессора . #if 0 [...] #endif
блоки не попадают в компилятор и не генерируют машинный код.
Вы можете продемонстрировать, что происходит с препроцессором с исходным файлом ifdef.cxx
:
#if 0
This code will not be compiled
#else
int i = 0;
#endif
Запуск gcc -E ifdef.cxx
покажет вам, что компилируется.
Вы можете использовать этот механизм для предотвращения компиляции блока кода во время цикла разработки, но вы, вероятно, не захотите регистрировать его в системе управления версиями, поскольку он просто добавляет беспорядка в ваш код и снижает удобочитаемость. Если это исторический фрагмент кода, который был закомментирован, его следует удалить: система управления версиями содержит историю, верно?
Кроме того, ответ может быть одинаковым как для C, так и для C ++, но языка C / C ++ не существует, и ссылаться на такой язык - не лучшая привычка.
Не совсем
int main(void)
{
#if 0
the apostrophe ' causes a warning
#endif
return 0;
}
Он показывает «tc: 4: 19: предупреждение: отсутствует завершающий символ» с gcc 4.2.4.
Это дешевый способ прокомментировать, но я подозреваю, что он может иметь отладочный потенциал. Например, предположим, что у вас есть сборка, которая выводит значения в файл. Возможно, вы не захотите этого в окончательной версии, поэтому вы можете использовать #if 0 ... #endif.
Кроме того, я подозреваю, что лучший способ сделать это для целей отладки - это сделать:
#ifdef DEBUG
// output to file
#endif
Вы можете сделать что-то подобное, и это может иметь больше смысла, и все, что вам нужно сделать, это определить DEBUG, чтобы увидеть результаты.
//
либо начинать раздел с/*
и заканчивать раздел с*/
. Проблема с последними методами заключается в том, что комментарии не вкладываются, поэтому разработчик должен проверять и обрабатывать любые данные*/
между началом и концом.