C ++ Многострочные комментарии с использованием обратной косой черты - PullRequest
18 голосов
/ 15 августа 2011

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

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

Ответы [ 3 ]

26 голосов
/ 15 августа 2011

Да. Строки, оканчивающиеся на \, сращиваются вместе со следующей строкой очень рано в процессе перевода. Это происходит на этапе 2 перевода, до удаления комментария и до того, как препроцессор сможет выполнить свою работу.

Распознавание и удаление комментариев происходит на этапе 3. По этой причине вы можете превратить комментарий // в нечто похожее на многострочный комментарий, используя \. Это обычно обманывает большинство синтаксических анализаторов исходного кода с подсветкой.

Препроцессор работает на этапе 4.

Все это означает, что вы можете "многострочно" практически все, используя \, включая комментарии и директивы препроцессора

#\
d\
e\
f\
i\
n\
e \
ABC \
int i

int main() {
A\
B\
C = 5;
}

P.S. Обратите внимание, что завершающий символ \ не вводит пробелы в линию сращивания. Это следует учитывать при написании многострочных комментариев с использованием функции \. Например, следующий комментарий

// to\
get\
her

означает единственное слово «вместе», а не три отдельных слова «получить ее». Очевидно, что неправильное использование \ в комментариях может сильно запутать и даже исказить их предполагаемое значение.

15 голосов
/ 15 августа 2011

Вот отличная причина , а не , чтобы сделать это.Следующая программа печатает «Это появится».

#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.

0 голосов
/ 15 августа 2011

Я первоначально сказал "Нет, ты не можешь".

Но я все еще говорю "Нет, вы НЕ ДОЛЖНЫ"!

Используйте / * * / вместо.

Пример:

#include <stdio.h>

int main ()
{
  // Begin comment \
     continue comment?
  return printf ("Hello world!\n");
}

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

  • "//" предназначены для однострочных комментариев (вы должны использовать "/ * * /" для вложенных комментариев и для многострочных комментариев

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

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

ИМХО ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...