【发布时间】:2021-02-25 13:32:33
【问题描述】:
关于 MISRA C 2012 规则 15.4 -“用于终止任何迭代语句的 break 或 goto 语句不应超过一个。” - 这个例子正确吗?任何人都可以使用一些工具(MISRA 检查器)确认这一点吗?
do {
retval = do_smth();
if (retval != OK) {
break;
}
retval = do_smth2();
if (retval != OK) {
break;
}
retval = do_smth3();
} while (0u);
这只是一个概念,但我在这里尝试的是用break 的级联替换goto 的级联(不幸的是在这种情况下被禁止)。我的观点是 do { } while(0u); 不是迭代语句。
你怎么看?
【问题讨论】:
-
do-while循环仍然是一个迭代语句,无论条件是否确保只有一次迭代。 -
上下文是什么?这是在宏声明中还是在什么地方,或者你为什么要使用 do-while(0)?
-
@Lundin:我认为早期的代码使用了几个
gotos(到同一个标签),do/while在这里用于实现与breaks 相同的行为。 -
正如@MOehm 所说。上下文在代码示例下方的问题中进行了描述。
-
除了一次性循环是否符合“迭代”条件之外,相关代码的可读性更少且更多令人困惑它取代了什么,因此不能证明它是本应确保可读性、可靠性和可维护性的练习的一部分。