В чем смысл многострочных предупреждений о комментариях в 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 \\ */