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

С++ Многострочные комментарии с использованием обратной косой черты

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

// 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
4b9b3361

Ответ 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");
}

Вышеприведенные компиляции по причинам, указанным в других сообщениях. Но это НЕПРАВИЛЬНО:

  • "//" ПРЕДНАЗНАЧЕН для однострочных комментариев (вы должны использовать "/* */" для вложенных и для многострочных комментариев

  • Опираясь на строки "\" продолжения - отличный способ внести странные, трудные для отладки ошибки в вашей программе.

Так же, как есть струнные бобы через нос: даже если вы МОЖЕТЕ, вы, вероятно, НЕ ДОЛЖНЫ.

ИМХО...