С++ Многострочные комментарии с использованием обратной косой черты
Можно ли продолжить комментарии к стилю в следующей строке, используя обратную косую черту, например многострочные макросы? Например.
// here is a comment \
and this is more comments \
const char* x = "hello"; // this line of "code" is actually still a comment
int x = 5; // and now an actual line of code
Ответы
Ответ 1
Да. Строки, заканчивающиеся на \
, соединяются со следующей строкой очень рано в процессе перевода. Это происходит на этапе 2 перевода, перед удалением комментария и до того, как препроцессор имеет возможность выполнить свою работу.
Учет и удаление комментариев происходит на этапе 3. По этой причине вы можете превратить комментарий //
в то, что выглядит как многострочный комментарий, используя \
. Обычно это приводит к тому, что синтаксические синтаксические анализаторы синтаксиса выделяют синтаксис.
Препроцессор работает на этапе 4.
Все это означает, что вы можете "многострочно" использовать все, используя \
, включая комментарии и препроцессорные директивы
#\
d\
e\
f\
i\
n\
e \
ABC \
int i
int main() {
A\
B\
C = 5;
}
P.S. Обратите внимание, что завершающий \
не вводит пробелы в сращиваемую строку. Это следует учитывать при написании многострочных комментариев с использованием функции \
. Например, следующий комментарий
// to\
get\
her
означает одно слово "вместе", а не три отдельных слова "получить ее". Очевидно, что неправильное использование \
в комментариях может кардинально запутывать и даже искажать их предполагаемое значение.
Ответ 2
Вот отличная причина не делать этого. Следующая программа печатает "Это будет отображаться".
#include <iostream>
int main()
{
std::cout << "This "
// A comment ... \
<< "will appear"
// Another comment ... \
<< ", but this won't"
<< std::endl;
}
Почему? Поскольку за первым \
следует пробел, и поэтому он просто часть комментария, а не символ привязки строк. Поведение программы может спокойно и значительно измениться из-за невидимого конечного пробела.
Еще лучшая причина не делать этого: g++ ошибается, даже с -pedantic
. Когда я скомпилирую эту программу с помощью g++, вывод будет только "This"; конечное пробел после первого \
игнорируется. По-моему, так оно и должно работать, но это не то, что говорит языковой стандарт. (Линейное сращивание происходит в фазе перевода 2. Я полагаю, можно утверждать, что конечные пробелы могут быть удалены в фазе 1, но я не уверен, что это действительный аргумент - и я не знаю, действительно ли у gcc-авторов сделал этот аргумент.) В любом случае g++ 4.5.2 и Sun CC версии 5.5 не согласны друг с другом.
Если вы хотите многострочные комментарии, используйте /* ... */
или вставьте //
в начале каждой строки. Я предпочитаю последнее, потому что гораздо проще сказать, что данная строка является частью комментария. (На самом деле это несколько однострочных комментариев.) Любой достойный редактор должен позволить вам сделать это, не набрав //
N раз для N строк. Или, если вы комментируете блок кода, используйте #if 0 ... #endif
.
Ответ 3
Я собирался сказать "нет", но на самом деле это выглядит (в соответствии с подсветкой синтаксиса vim).
Ответ 4
Я изначально сказал: "Нет, ты не можешь".
Но я все еще говорю "Нет, ты НЕ ДОЛЖЕН"!
Используйте/* */вместо этого.
Пример:
#include <stdio.h>
int main ()
{
// Begin comment \
continue comment?
return printf ("Hello world!\n");
}
Вышеприведенные компиляции по причинам, указанным в других сообщениях. Но это НЕПРАВИЛЬНО:
-
"//" ПРЕДНАЗНАЧЕН для однострочных комментариев (вы должны использовать "/* */" для вложенных и для многострочных комментариев
-
Опираясь на строки "\" продолжения - отличный способ внести странные, трудные для отладки ошибки в вашей программе.
Так же, как есть струнные бобы через нос: даже если вы МОЖЕТЕ, вы, вероятно, НЕ ДОЛЖНЫ.
ИМХО...