根据MISRA C++ 2-5-1
,我们通常应该避免弄乱有向图。但是,我不明白为什么我们也应该避免使用可读的单词and
,or
,not
等来定义公共运算符&&
,{{ 1}},...
这个问题甚至被强调为Sonar / MISRA的" major" 问题:
||
规则是否还包括人类可读有向图(与隐藏的[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规则是否有功能原因还包含人类可读有向图?我应该避免它们只是为了盲目地满足代码合规性规则还是有一些隐藏在后面的真正棘手的原因?
答案 0 :(得分:2)
Digraphs和Trigraphs只是词汇糖。编译器将用其他单个字符替换它们。
MISRA C ++规则2-3-1说"不得使用Trigraphs。"
Trigraphs都是以" ??"开头的所有字符。第三个字符定义了三字母的含义。 (例如" ?? - "与&#34相同;〜")
MISRA C ++ 2008没有列举这些内容。所以我假设所有的三字母都是有意义的。这些是:
??= ??/ ??’ ??( ??) ??! ??< ??> ??-
MISRA C ++规则2-5-1说&#34;不得使用有向图。&#34;
有向图是例如&#34;&LT;%&#34;或&#34;%&gt;&#34; (等于&#34; {&#34;和&#34;}&#34;)。
MISRA C ++ 2008列举了禁用的内容:
<% %> <: :> %: %:%:
有向图和三角图
对我来说,他们是古代的残骸。你可以写一个C ++程序,例如不使用任何牙套。它们使源代码不可读:
void a()
<%
int b<:2:> = <%0, 0%>;
%>
据我所知,MISRA C ++ 2008中没有规则禁止使用人类可读的逻辑运算符(尽管它们非常罕见)。这意味着Sonar规则比MISRA C ++ 2008更具限制性。我认为这是一个错误。
在我看来,C / C ++社区并不熟悉人类可读的逻辑运算符。所以应该避免它们。
BTW:C ++标准称它们为三字母和&#34;替代标记&#34;。逻辑opterator替代品在那里列举。