Зачем использовать #if 0 для комментирования блока? - PullRequest
28 голосов
/ 02 сентября 2010

Обратный инженерный код, и я отчасти потрясен этим стилем, но я хотел убедиться, что нет веских оснований для таких вещей ...

Это только я или это ужасностиль кодирования

if ( pwbuf ) sprintf(username,"%s",pwbuf->pw_name);
else sprintf(username,"%d",user_id);

И почему код переноса не предназначен для компиляции в

#if 0
....
#endif

Вместо комментариев?


РЕДАКТИРОВАТЬ: так, как некоторые объясняли нижеэто связано с возможностью flummox / * * /, которую я не осознавал.

Но я все еще не понимаю, почему бы просто не использовать инструменты среды программирования или макросы любимого текстового редактора для блокировки комментариевэто с использованием "//"

разве это не НАМНОГО более просто и легко узнать визуально, чтобы пропустить?


Разве я неопытен в C и пропустить, почему эти вещи могут быть хорошей идеей - или нет никакого оправдания, и я оправдан, чувствуя раздражение от того, насколько уродлив этот код?

Ответы [ 11 ]

36 голосов
/ 02 сентября 2010

#if 0 используется довольно часто, когда удаленный блок содержит комментарии к блоку

Не скажу, что это хорошая практика, но я вижу это довольно часто.

Одна строкаоператор flow-control + достаточно прост для понимания, хотя я лично его избегаю (и большинство руководств по кодированию, над которыми я работал, запрещают его)

Кстати, я бы, вероятно, отредактировал заголовок, чтобы он был несколько полезен«Зачем использовать #if 0 вместо блочных комментариев»

Если у вас есть следующее

#if 0
        silly();
        if(foo)
           bar();
        /* baz is a flumuxiation */
        baz = fib+3;
#endif

Если вы наивно замените #if 0 / #endif на /* */, это будетзаставляет комментарий заканчиваться сразу после flumuxiation, вызывая синтаксическую ошибку, когда вы нажимаете */ вместо #endif выше ..

EDIT: Последнее замечание, часто синтаксис #if 0используется только при разработке, особенно если вам требуется поддержка нескольких версий или зависимостей или аппаратных платформ.Нередко код изменяется на

#ifdef _COMPILED_WITHOUT_FEATURE_BAZ_
    much_code();
#endif

с централизованным заголовком, определяющим (или нет) сотни этих #define констант.Это не самая красивая вещь в мире, но каждый раз, когда я работал над проектом приличного размера, мы использовали некоторую комбинацию переключателей времени выполнения, констант времени компиляции (это), решений компиляции времени компиляции (просто используйте разные.cpp в зависимости от версии) и случайное шаблонное решение.Все зависит от деталей.

Пока вы разработчик, просто начинаете работать, хотя ... #if 0 довольно распространено, если вы не уверены, что старый код все еще работаетимеет значение.

18 голосов
/ 03 сентября 2010

Комментарии - это комментарии. Они описывают код.

Код, который исключается из компиляции, - это код, а не комментарии. Он часто будет содержать комментарии, описывающие код, который не компилируется, на данный момент /

Это две разные концепции, и использование одного и того же синтаксиса кажется мне ошибкой.

5 голосов
/ 03 сентября 2010

Помимо проблемы с вложенностью комментариев в стиле C, отключение блоков кода с помощью #if 0 имеет то преимущество, что его можно свернуть, если вы используете редактор, который поддерживает свертывание кода.Это также очень легко сделать в любом редакторе, тогда как отключение больших блоков кода с помощью комментариев в стиле C ++ может быть громоздким без поддержки редактора / макросов.

Кроме того, многие блоки #if 0 имеют блок elseтакже.Это дает простой способ переключения между двумя реализациями / алгоритмами и, вероятно, менее подвержен ошибкам, чем массовое комментирование одного раздела и массовое раскомментирование другого.Однако в этом случае лучше использовать что-то более читаемое, например #if DEBUG.

3 голосов
/ 03 сентября 2010

Что касается блочного комментирования с использованием //, я могу подумать об одной причине: если вы проверите этот код в своей системе контроля версий, журнал обвинений покажет вам, как последний редактор для этих строк код. Хотя вы, вероятно, хотите, чтобы комментарии были приписаны вам, в то же время сам код также присваивается вам. Конечно, вы можете вернуться к предыдущим ревизиям, если вам нужно проверить журнал обвинений на наличие «настоящего» автора кода, но это сэкономит время, если вы сохраните эту информацию в текущей ревизии.

3 голосов
/ 02 сентября 2010

Это довольно идиоматический C прямо здесь. Я не понимаю, что в этом плохого. Это не красивый кусок кода, но его легко прочитать и понятно, что происходит и почему, даже без контекста.

Имена переменных могли бы быть лучше, и было бы безопаснее использовать snprintf или, возможно, strncpy.

Если вы думаете, что могло бы быть лучше, как бы вы хотели, чтобы это выглядело?

Я мог бы сделать небольшое изменение:

char username[32];
strncpy(username, 30, (pwbuf ? pwbuf->pw_name : user_id));
username[31] = '\0';
1 голос
/ 02 сентября 2010

Очевидно, что у каждого свое мнение на этот счет. Так вот мое:

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

Поместить оператор управления в ту же строку, что и блок кода, еще хуже; отсутствие отступа затрудняет просмотр контроля потока во время чтения. После нескольких лет написания кода вы привыкли быстро и точно читать и интерпретировать код, при условии, что вы можете полагаться на определенные визуальные подсказки. Обойти эти реплики для «особых случаев» означает, что читатель должен остановиться и сделать двойной дубль без веской причины.

#if (0), с другой стороны, является нормальным во время разработки, но должен быть удален, когда код «стабилен» (или, по крайней мере, замените 0 на какое-либо значимое имя символа препроцессора).

0 голосов
/ 03 сентября 2010

#if 0 ... #endif довольно часто встречается в более старом C-коде.Причина в том, что комментирование с комментариями в стиле C /* .... */ не работает, потому что комментарии не вкладываются.

Даже если это распространено, я бы сказал, что ему не место в современном коде.Люди делали это в старину, потому что их текстовые редакторы не могли автоматически блокировать комментарии больших разделов.Более того, они не имели надлежащего контроля исходного кода, как сейчас.Нет оправдания тому, чтобы оставлять комментарии или # ifdef'd в рабочем коде.

0 голосов
/ 03 сентября 2010

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

if (strcmp(s, "foo") == 0)
{
    bitmap = 0x00000001UL;
    bit = 0;
}
else if (strcmp(s, "bar") == 0)
{
    bitmap = 0x00000002UL;
    bit = 1;
}
else if (strcmp(s, "baz") == 0)
{
    bitmap = 0x00000003UL;
    bit = 2;
}
else if (strcmp(s, "qux") == 0)
{
    bitmap = 0x00000008UL;
    bit = 3;
}
else
{
    bitmap = 0;
    bit = -1;
}

и краткую версию:

if      (strcmp(s, "foo") == 0) { bitmap = 0x00000001UL; bit = 0;  }
else if (strcmp(s, "bar") == 0) { bitmap = 0x00000002UL; bit = 1;  }
else if (strcmp(s, "baz") == 0) { bitmap = 0x00000003UL; bit = 2;  }
else if (strcmp(s, "qux") == 0) { bitmap = 0x00000008UL; bit = 3;  }
else                            { bitmap = 0;            bit = -1; }

Чаще всего ошибки попадают прямо в ваше лицо.

Отказ от ответственности: Этопример надуманный, как я уже сказал.Не стесняйтесь обсуждать использование strcmp, магических чисел и лучше ли использовать табличный подход.;)

0 голосов
/ 03 сентября 2010
if ( pwbuf ) sprintf(username,"%s",pwbuf->pw_name);
else sprintf(username,"%d",user_id);

Идиоматичный и лаконичный. Если бы к нему прикоснулись более 2 или 3 раз, я бы поставил его в скобки и добавил. Это не очень удобно, если вы добавляете информацию о регистрации или другие условия.

#if 0
....
#endif

Хорошо включить блоки отладочного кода или нет. Кроме того, можно избежать ошибок компиляции, связанных с попыткой заблокировать комментарий такого рода вещи:

/* line comment */
...
/* line comment again */

Поскольку комментарии блока C не вкладываются.

0 голосов
/ 02 сентября 2010

баллов выше отмеченных. Но мониторы широкоформатные, и все, в эти дни я вроде не против

if (pwbuf) sprintf(username,"%s",pwbuf->pw_name);
else       sprintf(username,"%d",user_id);

Всегда кажется, что на моем экране слишком много горизонтального пространства и недостаточно вертикального пространства!

Также, если блок кода уже имеет директивы препроцессора, не используйте #if 0; если код уже имеет комментарии к блоку, не используйте /* */. Если у него уже есть оба, либо прибегните к редактору, у которого есть ctrl + / , чтобы закомментировать множество строк. Если нет, вы напичканы, удалите код сразу!

...