首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

关于Misra C Code Stadard的有关问题

2013-07-11 
关于Misra C Code Stadard的问题Misra C的C语言编码标准里面有一条,“Rule14.5(Required): The continue st

关于Misra C Code Stadard的问题
Misra C的C语言编码标准里面有一条,
“Rule14.5(Required): The continue statement shall not be used.”
谁能告诉我为什么?因为本人最近要给项目组将编码规范,有些想自己搞清楚。 C 编码 标准
[解决办法]
continue语句不要用的原因:
1)对于continue来说,本来好好的循环的结构会被打破,这对cpu预取指令以及cpu流水线会产生较大的影响,会打破流水线的执行,影响性能。特别是循环结构中continue的应用对性能影响较大。
2)代码不好理解,对后续维护处理不便,特别是在循环结构中增加一些处理,就要考虑很多情况。

不过话说回来了,事情没有绝对的,只要看看linux内核里面有很多continue语句就知道了。
[解决办法]

不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
 if (条件1) break;
 //...
 if (条件2) continue;
 //...
 if (条件3) return;
 //...
}
因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。
典型如:
下面两段的语义都是当文件未结束时读字符
whlie (!feof(f)) {
 a=fgetc(f);
 //...
 b=fgetc(f);//可能此时已经feof了!
 //...
}
而这样写就没有问题:
whlie (1) {
 a=fgetc(f);
 if (feof(f)) break;
 //...
 b=fgetc(f);
 if (feof(f)) break;
 //...
}
类似的例子还可以举很多。

[解决办法]
维护“一个块只有一个入口一个出口”这一逻辑的好处远大于你的所需要付出的代价,尤其是对于没有析构一说的C语言,如果在块尾加上一段释放内存之类的清理代码,不需要担心会不会有哪个分支执行不到这里。

  事实上即使是有着RAII技术的C++中也需要这一逻辑,因为经常要让析构函数去处理“因异常而退出块”的情况,而正常结束时要进行的收尾工作还是要放在块尾。

象continue这种语句,多数时候有害,少数时候有用。如果一定要定一个规矩,那么坚决不用比不加限制好处要大。事实上,goto尚且可以利用它“一次性跳出多层循环”的能力而维持存在价值——如果不用goto就需要在多层循环中加标志变量,易读性反而不高;反而是continue,在goto、return、break、continue这四个破坏结构的语句中反而最没有存在意义,因为它只能省掉一个else。

热点排行