您的位置 首页 分销

嵌入式C言语的小技巧可以削减不少代码量

嵌入式C语言的小技巧能够减少不少代码量-为了写出适应性更广的C语言程序,程序员考虑问题时应面面俱到。例如,在C语言程序中调用 open() 函数尝试打开文件时,应考虑到文件是否存在,当前程序是否有足够权限等情况。

为了写出适应性更广的C言语程序,程序员考虑问题时应八面玲珑。例如,在C言语程序中调用 open() 函数测验翻开文件时,应考虑到文件是否存在,当时程序是否有满足权限等状况。在翻开文件失利时,需求做相应的过错处理,这样才干让程序的稳定性更强。

看到这儿,信任有读者现已发觉到了,过错处理句子会让整个代码繁琐许多。例如:int fd = open(“filename”, O_RDWR);if(fd < 0){printf("open file failed, %m\n");return -1;}if(sizeof("hello") != write(fd, "hello", sizeof("hello")) ){printf("write file failed, %m\n"); close(fd);return -1;}close(fd);

上面这段C言语代码做了相应的过错处理,可以处理翻开文件失利,和写数据失利的状况。可是大都状况下,咱们的C言语程序都不太可能去操作一个不允许操作,或许不存在操作的文件,而写数据也很少呈现失利的状况。事实上,假如不考虑很少呈现的意外,上述C言语代码可以这么写:int fd = open(“filename”, O_RDWR);write(fd, “hello”, sizeof(“hello”));close(fd);

明显,代码简练多了。可是,尽管“意外”呈现的几率比较低,咱们依然不能疏忽它,不然一旦“意外”呈现,程序溃散退出还好,假如程序持续运转,形成不行预知的过错就麻烦了。所以,在编写C言语程序时,增加相应的过错判断和处理句子是必要的。

在C言语程序开发中,某个函数的履行状况常常运用回来码区别,也即 return 的值。终究函数应该用什么样的回来值,决议什么履行状况,并没有强制规范。不过,关于 int 回来值类型的函数,大大都C言语程序员都爱运用 return 0; 表明函数履行成功,函数履行失利时,则回来一个负值(如 return -1;)。

请看下面这个函数:int test(int val){if(val % 99999 == 0)return -1;printf(“val = %d\n”, val);return0;}从上述C言语代码可以看出,test() 函数接纳一个 int 型的参数 val,假如 val 为 99999 的倍数,则回来 -1(这儿以为犯错),不然打印出 val 的值并回来 0。

嵌入式C言语的小技巧可以削减不少代码量

依照上面的评论,开发C言语程序时应考虑各种“意外”,在调用 test() 函数时,需求相应的过错处理代码:if(-1 == test(val)){// do somethingreturn -1;}

在实践的C言语项目开发中,有时会遇到重复调用某个函数的状况,例如:if(-1 == test(a)){// do somethingreturn -1;}if(-1 == test(b)){// do somethingreturn -1;}if(-1 == test(c)){// do somethingreturn -1;}…if(-1 == test(m)){// do somethingreturn -1;}

test() 函数犯错的几率很小,可是为了程序的稳定性,依然需求相应的过错处理代码。可是过错处理也让原本很简练的代码段变得“烦琐”,并且这些过错处理代码被履行的可能性微乎其微。这儿的test() 函数仅仅为了评论主题提出的比如。读者应考虑实践状况,例如:没有程序员会调用 open() 翻开一个不允许操作的文件,可是过错处理代码依然是不行少的。

当然,重复的代码可以运用宏界说封装,这一点之前的文章现已评论过,不再赘述了。值得阐明的别的一个办法便是运用 test() 履行成功时回来值为 0 的特色,请看下面这段C言语代码:int ret = 0;ret += test(a);ret += test(b);ret += test(c);…ret += test(m);if(0!=ret){// do somethingreturn -1;}

可以看出,这样就只需写一处过错处理代码了,并且只需有一个 test() 履行失利,C言语程序就会履行它。这样是一个折中,在极力保持代码简练性的基础上,保存过错处理逻辑。明显,只要 test() 的过错无需马上处理时才干这么写。

一般来说,运用 ret+=test 折中计划只合适无需马上处理过错的状况,此刻一切的 test() 调用都被视为等价的操作。所以在过错处理代码中,常常不再考虑终究是哪一个 test() 犯错。不过,假如期望知道终究是哪个或许哪几个函数 test() 犯错,也是有办法的。

明显,应该从 test() 函数自身下手。最简略的办法便是在 test() 函数回来 -1 之前打印出输入的参数,修改后的 test() 的C言语代码如下:int test(int val){if(val % 99999 == 0){printf(“unexpected val: %d\n”, val);return -1;}printf(“val = %d\n”, val);return0;}

这样就可以经过输入的参数 val 确认哪一个 test() 犯错了。不过这种办法要求各个 test() 接纳到的参数各不相同,不然就失效了。

幸亏还有其他调试手法。假如可以知道 test() 函数的调用链(我之前的文章评论过“调用链”这个概念),那C言语程序的犯错途径也就清楚明了了。所以,要定位终究哪一个 test() 犯错,只需在 test() 犯错时将函数调用链打印出来就可以了。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/fenxiao/98460.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部