为嵌入式系统开发软件需要时间——通常比最初预期的要多。
造成这种情况的一个原因是,虽然初始编码可能进展迅速,但调试周期似乎是无休止的。以后,代码的维护是不可避免的,而且需要比预期更多的时间。这是因为在尝试修改之前准确理解代码的功能会产生开销。
这一观察的结果是,应高度重视代码的可读性。易于阅读的代码不太可能出现错误,因此减少了调试时间。如果代码易于理解,则更易于维护。因此,请始终牢记人类读者——毕竟,它可能是你。(我听说它建议你假设你的代码未来的维护者是一个知道你家庭地址的精神病患者。)
代码由两部分组成:编译器需要看到的东西(C 语句和声明)和需要对编译器隐藏的文本(主要是供人类读者使用的)。隐藏的东西主要是:
文档——代码中的注释
暂时删除的代码——调试过程中不可避免的一部分
调试/跟踪代码——可以根据需要打开和关闭
有趣的是,如果您取出纯粹为人类读者阅读的内容(其中还包括使用有意义的标识符和额外的空格,如换行符),结果是完全不可读的代码。一些软件公司利用这一点来分发源代码,同时保护他们的知识产权。
我将看看我们对编译器隐藏的东西。
文档
每个人都知道评论是个好主意,但我们都很懒惰。然而,这种努力是值得的。旧式/* 。.. */ C注释还可以,但我觉得 C++ 行尾[ //。.. ]的变化更清晰。它们仍然需要小心使用。例如,像这样的代码:
并且不要使用标签。它们不是便携式的。
临时代码删除
在调试和测试代码的过程中,能够暂时“关闭”一段代码通常很有用。许多程序员通过将/*放在开头,将*/放在结尾来“注释掉”代码以实现此结果。这是快速而肮脏的,但经常无法达到所需的结果。许多编译器不支持嵌套注释,因此,如果代码已经被注释,就会出现问题。总的来说,它容易出错,应该避免。
使用 C++ 风格的//注释符号——即,将//放在每行的开头——稍微好一点,但应用起来非常乏味,而且在删除时也可能容易出错。
实现此结果的最佳方法是使用预处理器指令,因此:
在任何情况下,“关闭”的代码序列都不应包含在任何正在考虑发布的代码中。
调试/跟踪代码
另一种临时代码是为了便于在调试时输出或记录额外信息而包含的。尽管现代调试器和此类工具可能非常有效,但有时检测代码仍然是弄清楚到底发生了什么的最佳方式。现代开发工具是如此之快,以至于重建以创建启用调试的映像并不是一个严重的开销。
促进这一点的常用方法是使用预处理器指令,因此:
因此,当定义符号DEBUG_TRACE时,将包含调试代码。
一个稍微不同的方法是这样编码:
这个双重否定看起来很笨拙,但是这个符号用于控制标准的assert()宏。程序员需要定义符号来抑制调试模式。我感谢 Michael Barr,他在嵌入式 C 编码标准中提高了我对这种方法的认识。
审核编辑:郭婷
-
嵌入式
+关注
关注
5082文章
19103浏览量
304727 -
C++
+关注
关注
22文章
2108浏览量
73610 -
编译器
+关注
关注
1文章
1623浏览量
49104
发布评论请先 登录
相关推荐
评论