Подтвердить что ты не робот

Зачем использовать #if 0 для комментирования блока?

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

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

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

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

#if 0
....
#endif

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


EDIT: так, как объясняется ниже, это связано с возможностью flummox/* */, которую я не понимал.

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

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


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

4b9b3361

Ответ 1

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

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

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

Кстати, я бы, вероятно, отредактировал название, чтобы быть несколько полезным. "Зачем использовать #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 довольно распространен, если вы не уверены, что старый код по-прежнему имеет значение.

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

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

Если вы думаете, что это может быть лучше, что бы вы предпочли, чтобы он выглядел?

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

char username[32];
strncpy(username, 30, (pwbuf ? pwbuf->pw_name : user_id));
username[31] = '\0';

Ответ 5

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

Ответ 6

Очевидно, у каждого есть свои мнения по этому поводу. Итак, здесь мое:

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

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

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

Ответ 7

Вот там! Не переусердствуйте...

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

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

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

Лично я ненавижу следующий стиль, так как он настолько затянут, что затрудняет просмотр файла.

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

Ответ 8

указано выше. Но мониторы являются широкоэкранными и всеми, в наши дни, я вроде как не против.

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

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

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

Ответ 9

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 не вложены.

Ответ 10

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

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, магических чисел, и если подход на основе таблицы будет лучше.;)

Ответ 11

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

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