В чем смысл многострочных предупреждений о комментариях в C?
Я работаю над файлом C для задания домашней работы, и я подумал, что это может помочь грейдерам, если бы я сделал мои ответы видимыми так:
//**********|ANSWER|************\\
//blah blah blah, answering the
//questions, etc etc
и обнаружил при компиляции с gcc, что эти символы обратной косой черты в конце первой строки, похоже, вызывают предупреждение с несколькими строками. Когда я удалил их, предупреждение исчезло. Поэтому мой вопрос двоякий:
a) как именно присутствие символов обратной косой черты делает его "многострочным комментарием" и
б) почему в любом случае проблема с многострочным комментарием?
Ответы
Ответ 1
C (начиная со стандарта 1999 года) имеет две формы комментариев.
Комментарии старого стиля вводятся /*
и заканчиваются на */
и могут охватывать часть строки, полную строку или несколько строк.
Комментарии в стиле С++ вводятся //
и заканчиваются концом строки.
Но обратная косая черта в конце строки заставляет эту строку сращиваться со следующей строкой. Таким образом, вы можете юридически ввести комментарий с помощью //
, поставить обратную косую черту в конце строки и заставить комментарий охватывать несколько физических линий (но только одну логическую строку).
Что вы делаете в своей первой строке:
//**********|ANSWER|************\\
Просто используйте что-то другое, кроме обратной косой черты в конце строки, например:
//**********|ANSWER|************//
Хотя даже это потенциально вводит в заблуждение, поскольку оно почти похоже на комментарий /* .. */
в старом стиле. Вы можете подумать немного проще:
/////////// |ANSWER| ////////////
или
/**********|ANSWER|************/
Ответ 2
Компилятор просто сообщает вам, что вы случайно прокомментировали следующую строку кода, завершив предыдущую строку комментария с помощью \
, которая является символом продолжения строки в C. Это приводит к тому, что вторая строка будет конкатенирована с первый. Это, в свою очередь, делает комментарий //
фактически комментирующим как исходные строки. В вашем случае это не проблема, так как следующая строка также является комментарием.
Но если следующая строка не была предназначена для комментариев, вы могли бы оказаться в "странном поведении": компилятор игнорировал вторую строку без видимых причин. Ситуация часто осложняется тем, что некоторые редакторы кода с подсветкой синтаксиса не обнаруживают эту ситуацию и не выделяют следующую строку в качестве комментария.
Как правило, по этой конкретной причине не рекомендуется злоупотреблять символом \
как уровень кода. Используйте его, только если вам действительно нужно, т.е. Только если вы действительно хотите сшить несколько строк в один.
Ответ 3
a) как именно присутствие символов обратной косой черты делает его "многострочным комментарием" и
Обратная косая черта как последний символ в строке означает, что компилятор должен игнорировать обратную косую черту и символа новой строки - он сообщает компилятору сделать это, прежде чем он будет проверять комментарии. Поэтому он говорит, что перед удалением комментариев он должен эффективно смотреть
//**********|ANSWER|************\//blah blah blah, answering the
//questions, etc etc
теперь он видит //
в начале и игнорирует остальную часть строки
b) почему в любом случае проблема с многострочным комментарием?
В вашем примере это не так, поскольку вторая строка является комментарием в любом случае, но что, если вы написали что-то полезное на второй строке?
Ну, так как вы задали вопрос "a", вероятно, вы не понимали, что компилятор вел себя так, и если вы не понимаете, что вы закомментировали строку кода, то это довольно хорошо из компилятор, чтобы предупредить вас.
Другая причина заключается в том, что даже если бы это было известно, обычно редактор не будет явно показывать пробелы, и поэтому легко пропустить, что обратная косая черта может быть или не быть последним символом на линии. Например:
int i = 42;
// backslash+space: \
i++
// backslash and no space: \
i--
printf("%d\n", i);
Результатом будет 43
, поскольку i--
закомментирован, но i++
нет (потому что обратная косая черта не является последним символом в строке, а пробелом).
Ответ 4
Никто не спросил, но это главный ответ в Google, поэтому
Подавление, это конкретное предупреждение может быть сделано с помощью опции -Wno-comment
.
Ответ 5
Это будет комментировать строку под ней. Если вы хотите сделать это на одной строке без предупреждения, попробуйте
/* // Bla \\ */