Разница в стиле комментариев между C и C++

Есть ли разница между стилем комментирования между C(/*..*/) и C++(//)?

MISRA C говорит

Правило 2.2 (обязательно): Исходный код должен использовать только комментарии в стиле /* … */.

MISRA C++ говорит

Правило 2.7.1 (обязательное): Последовательность символов /* не должна использоваться с комментариями в стиле c.

В правиле 2.7.3 предложенный комментарий обозначен как // для С++.

Кто-нибудь может объяснить, почему MISRA говорит использовать /* в C и // в C++?


person Embedded C    schedule 29.01.2016    source источник
comment
это не разница. почему misra c предлагает /* */, а misra c++ предлагает //   -  person Embedded C    schedule 29.01.2016
comment
для тех, кто знает о мисре они могут ответить. другие ссылаются на это и дают ответ и комментарии. понять мой вопрос   -  person Embedded C    schedule 29.01.2016
comment
Пожалуйста, цитируйте стандарты дословно. Нет никаких шансов, что MISRA буквально произносит предлагаемый комментарий как // для c++. И я подозреваю, что 2.7.1 говорит внутри, а не с.   -  person molbdnilo    schedule 29.01.2016
comment
@molbdnilo Я не могу поделиться руководством по мисре, вы можете погуглить и посмотреть, что там написано. вот почему я указываю правила   -  person Embedded C    schedule 29.01.2016


Ответы (7)


Предложение MISRA C, которое вы цитируете, требует, чтобы строчные комментарии формы

//    This is a line comment

не использоваться в пользу комментария в стиле C в форме

/*   Original C style comment
          Can extend across multiple lines
*/

Это позволяет использовать более старые компиляторы, поскольку строковый комментарий был введен только в 1999 году и до этого был доступен только с некоторыми компиляторами в качестве нестандартного расширения.

Предложение MISRA C++, которое вы цитируете (по памяти, подобное есть в MISRA C), требует, чтобы исходный комментарий в стиле C не был вложенным. Так что это обескураживает

/*   Warning:   non-standard nesting of comment
     /*   Nested comment
     */
*/

Причина, по которой это не рекомендуется, заключается в том, что его поддержка не является стандартной, но некоторые компиляторы могут быть настроены для ее поддержки. Поэтому код, использующий вложенные комментарии, может вести себя по-разному (включая компиляцию одним компилятором, но не другим). Однако код без вложенных комментариев будет компилироваться должным образом, независимо от того, поддерживает ли компилятор вложенные комментарии.

Нет проблем с вложенностью строковых комментариев, так как // заставляет компилятор игнорировать все до конца строки. В C++ это нормально, так как (в отличие от C) все версии C++ (даже нестандартные) поддерживают строчные комментарии. (Есть исключения, если используются орграфы или триграфы, но MISRA также не одобряет их использование).

person Peter    schedule 29.01.2016

Правило 2.2 означает, что C разрешает только комментарии /**/, а правила 2.7.1 предписывают не вкладывать комментарии C, запрещая использование /* в комментарии C. Они не связаны.

person Cecilio Pardo    schedule 29.01.2016
comment
Первая часть для C, вторая для C++. Что немного мутит воду: означает ли это, что вам разрешено вкладывать комментарии C в C, но не согласно 2.7.1, в C++< /б>? - person Jongware; 29.01.2016
comment
@Jongware Для C есть такое же правило 2.3 (думаю, у меня нет документов MISRA C++). - person user694733; 29.01.2016
comment
@Cecillio да, я не включил его, теперь проверьте вопрос, который связан - person Embedded C; 29.01.2016
comment
Нет, они не связаны. Первое правило о запрете // в C, второе правило о запрете вложенности. - person Cecilio Pardo; 29.01.2016

У C89 было только /* ... */ для комментариев. Но комментарии в стиле C++ // .. были добавлены в C в C99. Я думаю, что MISRA просто пытается сохранить согласованность, чтобы комментарии в стиле C++ не стали проблемой, если вы компилируете код C в C89/C90.

Но это уже редко имеет значение, поскольку оба стиля комментариев поддерживаются как в современном C, так и в C++.

Вы можете прочитать обоснование MISRA для рассуждений:

Обоснование MISRA-C-2004:

Правило 2.3 (обязательно): последовательность символов /* не должна использоваться в комментарии.

C не поддерживает вложенность комментариев, хотя некоторые компиляторы поддерживают это как расширение языка. Комментарий начинается с /* и продолжается до тех пор, пока не встретится первый */. Любой символ /* внутри комментария является нарушением этого правила.

Рассмотрим следующий фрагмент кода: /* какой-то комментарий, маркер конца комментария случайно пропущен ‹> Perform_Critical_Safety_Function(X); /* этот комментарий не соответствует требованиям */

При просмотре страницы, содержащей вызов функции, предполагается, что это исполняемый код. Из-за случайного пропуска маркера конца комментария вызов критической с точки зрения безопасности функции не будет выполнен.

Обоснование MISRA-C++ 2008:

Правило 2-7-1 Последовательность символов /* не должна использоваться в комментарии в стиле C.

C++ не поддерживает вложение комментариев в стиле C, хотя некоторые компиляторы поддерживают это как непереносимое расширение языка. Комментарий, начинающийся с /*, продолжается до тех пор, пока не встретится первый */. Любой символ /* внутри комментария является нарушением этого правила.

person P.P    schedule 29.01.2016

Хотя // было невероятно распространенным нестандартным расширением для компиляторов C90, оно никогда не разрешалось стандартом C90. Обоснование правила MISRA заключается в том, что вы должны следовать применимому языковому стандарту.

Итак, это довольно просто:

  • MISRA-C:2004 предназначен для C90, в котором разрешено только /* */ комментариев.
  • MISRA-C++:2008 предназначен для C++, что позволяет // комментировать (независимо от версии C++).
  • MISRA-C:2012 предназначен для C99, что позволяет // комментариев.

Из-за вышеизложенного правило, на которое вы ссылаетесь, было удалено в MISRA-C:2012. Рассмотрите возможность обновления до версии MISRA 2012 года, так как она была улучшена во многих отношениях.

person Lundin    schedule 29.01.2016

Из MISRA C 2004:

Правило 2.2 (обязательное): Исходный код должен использовать только комментарии в стиле /* … */.

Это исключает использование комментариев в стиле // C99 и комментариев в стиле C++, поскольку они не разрешены в C90. Многие компиляторы поддерживают стиль комментариев // как расширение стиля C90. Использование // в директивах препроцессора (например, #define) может варьироваться. Также смешивание /* … */ и // несовместимо. Это больше, чем проблема стиля, поскольку разные (до C99) компиляторы могут вести себя по-разному.

Я думаю, это все объясняет, но я все же добавлю свое объяснение со ссылками.

В оригинальном C (до C99) не было // комментариев. C++ ввел префикс комментария с двойной косой чертой // как способ комментировать отдельные строки.

Для большей ясности давайте построчно:

Это исключает использование комментариев в стиле // C99 и комментариев в стиле C++, поскольку они не разрешены в C90.

В настоящее время современные компиляторы, такие как gcc, начали поддерживать такие // и в режиме C90, но по-прежнему будут выдавать предупреждение вроде:

предупреждение: комментарии в стиле C++ не разрешены в C90

но рекомендуется использовать комментарии /*..*/ в C90 C.

Многие компиляторы поддерживают стиль комментариев // как расширение стиля C90.

Именно об этом я и сказал выше, но все же не рекомендуется использовать // в C90 C, так как код не будет переносимым. Например, этот код будет скомпилирован с gcc, но с другим компилятором, у которого нет расширения, он не скомпилируется.

Использование // в директивах препроцессора (например, #define) может варьироваться.

Я думаю смысл этого ясен. В нем говорится, что использование // не будет согласованным в директивах препроцессора.

Также смешивание /* ... */ и // несовместимо.

Как? Это возможно. Как я упоминал выше, это зависит от компилятора. В C99 C это будет в основном согласовано, но если вы говорите о компиляторах до C99, имеет значение, поддерживают они или не поддерживают комментарии //.

Это больше, чем проблема стиля, поскольку разные (до C99) компиляторы могут вести себя по-разному.

Да, это так. Так как это MISRA 2004, в котором в основном речь идет о pre C90 C. Это связано с тем, что большинство компиляторов C90 не поддерживают //, и поэтому вы получите сообщение об ошибке. Если вы используете C99, это неверно.


Ожидаются вопросы

Почему не было // в C до C99, а затем почему оно было введено в C++? Есть ли конкретная причина?

C произошло от B. B произошло от BCPL. // были созданы во время BCPL, поэтому BCPl использовал их. Его преемник B начал использовать /*...*/, которые были унаследованы C. Хотя, C++ решил воскресить комментарии BCPL и, конечно же, использовал /*...*/. В то время стандарт C рассматривал // как нестандартную функцию.

Когда C99 C был представлен, он имел комментарии //.

Как называются комментарии // и /*...*/?

Комментарии // называются однострочными комментариями, поскольку они могут занимать только одну строку.

Комментарии /*...*/ называются многострочными комментариями, поскольку они могут занимать несколько строк.

Обязательно ли использовать только один вид комментариев в исходном коде?

Нет, можно использовать любой и даже оба. Хотя некоторые говорят, что использование только одного типа делает код читабельным. Это больше вопрос мнения.

Правило 2.2 MISRA C 2004 устарело?

Что-то вроде. Недавно была выпущена MISRA 2012 с этими изменениями. Хотя, если вы думаете, что MISRA C 2004 неверна, так как концентрируется только на пред-C99, то это не так. Я бы рекомендовал использовать MISRA 2012 в настоящее время.

person Ashish Ahuja    schedule 01.03.2016

Короче говоря, эти стандарты должны помочь программистам избежать непоследовательного поведения компилятора из-за стиля комментариев, когда они компилируют свой код с использованием разных стандартов компилятора.

Это обоснование стандартов.


Более развернутый ответ:

Это связано с тем, что комментарий строки // не поддерживается до стандарта C99. Хотя MISRA-C 2004 документ создается для поддержки C89/C90 стандарта.

Правило 2.2 (обязательно): Исходный код должен использовать только комментарии в стиле /* … */.

Это исключает использование // комментариев в стиле C99 и комментариев в стиле C++, поскольку они не разрешены в C90. Многие компиляторы поддерживают стиль комментариев // как расширение C90. Использование // в директивах препроцессора (например, #define) может варьироваться. Также смешивание /* … */ и // несовместимо. Это больше, чем проблема стиля, поскольку разные компиляторы (до C99) могут вести себя по-разному.

Проверьте ответ Лундина на этот пост. Кроме того, проверьте этот сообщение SO на C комментарий строки перед C99.

Таким образом, это объясняет, почему пункт MISRA-C 2004, который вы публикуете, требует использования /*.

С той же идеей стандарт MISRA-C++ 2008 не рекомендует использовать /* — комментарий в стиле C (многострочный) — в C++, поскольку некоторые компиляторы могут генерировать ошибки. Рекомендуется использовать //, так как это «оригинальный» стиль комментария C++.

person Ian    schedule 29.02.2016

Правило 2.7.1 (обязательное): Последовательность символов /* не должна использоваться с комментариями в стиле c.

(выделение добавлено)

Я думаю, вы просто неправильно понимаете значение слова «с» в приведенном выше правиле и интерпретируете его в том смысле, что «не следует использовать для комментариев в стиле c».

Возможно, правило было бы более ясным, если бы использовалось слово «внутри», а не «с».

person Chip Grandits    schedule 04.03.2016