Я обычно комментирую блоки кода, используя /* */
в верхней части каждого раздела. Я не использую встроенные комментарии, за исключением особых обстоятельств (например, хитрый код), потому что я чувствую, что комментарии «скрыты», и код может быть расширен позже, и комментарии должны будут управляться на микроуровне. Например:
int parseEverything()
{
/* Initialize the parser. */
random_code_here();
still_more_init();
/// (Note: the above line still falls under the init section, even if it's separated by a newline.)
/* Main parser loop. */
while(!done_parsing) {
/* Grab the token. */
if(x) {
/* Preprocessor stuff. */
y();
} else {
/* Normal token. */
z();
}
/* Insert into tree. */
make_tree_node();
insert_into_tree();
/* Move to next token. */
++streamPtr;
/// (Note: the above could be expanded to take up multiple lines, thus
/// if an inline comment were used it'd have to be moved, if
/// you even remember there's a comment there.)
}
clean_up();
}
Конечно, если код очевиден, он не должен требовать комментария, как в clean_up()
. Включение комментария не повредит, хотя, и если его развернуть позже, будет легче узнать, куда добавить дополнительный код очистки.
Используя эту схему, я обнаружил, что легко следовать функции исключительно по ее комментариям. parseEverything
имеет три основных раздела: инициализация, основной цикл и очистка. В основном цикле мы берем токен (препроцессор или обычный), вставляем его в дерево и переходим к следующему токену.
Скорее всего, каждый раздел вызывает свой собственный [набор] функций, поэтому ясно, что вам может потребоваться рефакторинг, если разделы становятся громоздкими.
Я должен добавить, что я форматирую многострочные комментарии как таковые (моя «IDE» (Vim
) вставляет *
в каждую строку для меня со сценариями по умолчанию (для моего дистрибутива), что удобно):
/*
* This is a comment which normally would be on one line, but is either split into multiple
* lines for emphasis or so we don't have 160-character hard-to-read comments everywhere.
*/
Также я комментирую #else
и #endif
:
#ifndef FOO_H
#define FOO_H
#ifdef DEBUG
#else /* DEBUG */
#endif /* !DEBUG */
#endif /* FOO_H */
Но это немного не по теме.
(#include
охранникам не требуется not
(!
) перед ними, потому что их использование очевидно, и это традиция. =])