Не следует использовать диграфы с ++ (MISRA C ++ 2-5-1)

В соответствии с MISRA C++ 2-5-1 мы должны вообще избегать путаницы с орграфами. Хотя я не понимаю, почему мы должны также избегать использования читаемых слов and, or, not и т.д., чтобы определить общие операторы &&, ||

Проблема даже выделена как «основной» выпуск для сонара / MISRA:

[Major]     Open    Replace this digraph 'and' by its equivalent '&&'
[Major]     Open    Replace this digraph 'and' by its equivalent '&&'
[Major]     Open    Replace this digraph 'or' by its equivalent '||'
[Major]     Open    Replace this digraph 'or' by its equivalent '||'
[Major]     Open    Replace this digraph 'or' by its equivalent '||'

Это правило также включает в себя человек читаемый орграфы (которые сильно отличаются от загадочных ??=, ??/) по конкретной причине или правило просто тоже общий?
Я не обнаружил какого-либо конкретного риска или побочного эффекта при их использовании, я не прав?

Подводя итоги

Есть ли функциональная причина для этого правила MISRA, чтобы включить также человек читаемый орграфы? Должен ли я избегать их только для того, чтобы слепо удовлетворять правилу соответствия кода, или есть какая-то хитрая причина, скрывающаяся за этим?

5

Решение

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

Правило MISRA C ++ 2-3-1 гласит: «Триграфы не должны использоваться».

Триграфы — это все символы, которые начинаются с «??» и третий символ, который определяет, что означает триграф. (например, «?? -» совпадает с «~»)

MISRA C ++ 2008 не перечисляет их. Поэтому я предполагаю, что подразумеваются все триграфы. Это:

??= ??/ ??’ ??( ??) ??! ??< ??> ??-

Правило MISRA C ++ 2-5-1 гласит: «Диграфы не должны использоваться».

Диграфы, например, «<% «или»%> «(равно» {«и»} «).

MISRA C ++ 2008 перечисляет запрещенные:

<% %> <: :> %: %:%:

Диграфы и триграфы

Для меня они реликты с древних времен. Вы можете написать программу на C ++, например без использования каких-либо скобок. Они делают исходный код нечитаемым:

void a()
<%
int b<:2:> = <%0, 0%>;
%>

Насколько я вижу, в MISRA C ++ 2008 нет правила, запрещающего использование читаемых человеком логических операторов (хотя они очень редки). Это означает, что правило Sonar является более строгим, чем MISRA C ++ 2008. Я думаю, что это ошибка.

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

Кстати: стандарт C ++ называет их триграфами и «альтернативными токенами». Альтернативные логические операторы перечисляются там как таковые.

2

Другие решения


По вопросам рекламы [email protected]