В C/С++
Что происходит с кодом, помещенным между блоком #if 0
/#endif
?
#if 0
//Code goes here
#endif
Пропустит ли код просто и поэтому не выполняется?
В C/С++
Что происходит с кодом, помещенным между блоком #if 0
/#endif
?
#if 0
//Code goes here
#endif
Пропустит ли код просто и поэтому не выполняется?
Он не только не выполняется, но даже не компилируется.
#if
- это команда препроцессора, которая оценивается до фактического этапа компиляции. Код внутри этого блока не отображается в скомпилированном двоичном файле.
Он часто используется для временного удаления сегментов кода с намерением вернуть их позже.
Он идентичен комментарию блока, за исключением одного важного отличия: Nesting не является проблемой. Рассмотрим этот код:
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
будут гнездиться друг с другом, например:
#if 0
pre_foo();
#if 0
foo();
bar(x, y); /* x must not be NULL */
baz();
#endif
quux();
#endif
Хотя, конечно, это может немного запутаться и стать головной болью обслуживания, если не будет правильно прокомментировать.
Он постоянно комментирует этот код, поэтому компилятор его не будет компилировать.
Кодер может позже изменить #ifdef, чтобы этот код был скомпилирован в программе, если он захочет.
Это точно так же, как код не существует.
Что именно делает блок #if 0... #endif?
Это говорит вам, что автор, очевидно, никогда не слышал о системе контроля версий. Который, в свою очередь, подскажет вам работать как можно дальше & hellip;
Я хотел бы добавить для случая #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 С++ команда switch/P выполнит препроцессор и поместит результаты в файл .i.
Линии, начинающиеся с #
, директивы препроцессора. Блоки #if 0 [...] #endif
не попадают в компилятор и не генерируют машинный код.
Вы можете продемонстрировать, что происходит с препроцессором с исходным файлом ifdef.cxx
:
#if 0
This code will not be compiled
#else
int i = 0;
#endif
Запуск gcc -E ifdef.cxx
покажет вам, что скомпилировано.
Вы можете использовать этот механизм, чтобы предотвратить компиляцию блока кода во время цикла разработки, но вам, вероятно, не захочется проверять его на свой исходный элемент управления, поскольку он просто добавляет к вашему коду жесткость и снижает читаемость. Если это исторический фрагмент кода, который был прокомментирован, его следует удалить: исходный элемент управления содержит историю, правильно?
Кроме того, ответ может быть одинаковым как для C, так и для С++, но нет языка C/С++, и это не хорошая привычка ссылаться на такой язык.
Не совсем
int main(void)
{
#if 0
the apostrophe ' causes a warning
#endif
return 0;
}
Он показывает "t.c: 4: 19: предупреждение: отсутствует завершающий символ" с gcc 4.2.4
Это дешевый способ прокомментировать, но я подозреваю, что он может иметь отладочный потенциал. Например, предположим, что у вас есть сборка, которая выводит значения в файл. Возможно, вы не захотите этого в финальной версии, чтобы использовать #if 0... #endif.
Кроме того, я подозреваю, что лучший способ сделать это для цели отладки:
#ifdef DEBUG
// output to file
#endif
Вы можете сделать что-то подобное, и это может иметь больше смысла, и все, что вам нужно сделать, это определить DEBUG, чтобы увидеть результаты.