В 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
гніздяться один з одним, як-от так:
#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?
Це говорить вам про те, що автор, очевидно, ніколи не чув про систему контролю версій. Що, у свою чергу, говорить про те, щоб бігти якомога далі…
Коли препроцесор бачить #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, щоб побачити результати.
//
або розпочати розділ з/*
і закінчити розділ*/
. Проблема останніх методів полягає в тому, що коментар не гніздиться, тому розробник повинен перевіряти та обробляти будь-яке*/
між початком і кінцем.