现代编译器的可读性胜过调试

描述

  编写代码时,您的首要任务应该是可读性。大量时间花在调试和维护代码上,通常远远超过最初编写代码所花费的时间。因此,使该过程高效是必不可少的。考虑到未来人类读者的需求(可能是你,当然!)比试图让代码“高效”更重要——这项工作主要可以留给现代编译器。

  这种考虑意味着代码应该非常仔细地格式化和对齐,并且语言结构应该尽可能简单和透明。有许多已发布的指南可以帮助解决这些问题。但是,创建可读代码并不止于此。

  当你编译代码时,编程语言被翻译成机器指令。这是显而易见的。然而,编译器实际接收的是一个字符流;有些是实际代码,但可能有一些不打算翻译的块,其他文本可能仅供人类使用:

  文档——代码中的注释

  临时删除的代码——调试过程的一部分,但它可能会持续存在

  特殊调试/跟踪代码

  每一个的实现都会对可读性产生一些影响。

  文档

  每个人都知道评论是个好主意,但我们大多数人都很懒惰。但是,一些努力是非常值得的。旧式/*.。.*/注释符号是可以接受的,但新的行尾//。..形式更清晰。仍然需要护理。例如:

  int number; // input count

  char c; // single character buffer

  char buffer[99]; // the input line

  很难跟上。对齐就是一切:

  int number; // input count

  char c; // single character buffer

  char buffer[99]; // the input line

  并且不要使用标签;它们不是便携式的。

  临时代码删除

  在软件开发过程中,想要对编译器“隐藏”部分代码——将其关闭——并不少见。执行此操作的传统方法是“注释掉”——在代码前加/* ,在后加*/。虽然做起来很快,但它很容易失效,因为编译器不一定支持注释嵌套。较新的//表示法稍微好一点,但应用和删除很繁琐,并且仍然容易出错。

  实现此结果的最佳方法是使用预处理器指令,因此:

  #if 0

  #endif

  Debug/Trace code

  A particular kind of temporarily visible code is instrumentation – extra code added for debugging and/or tracing. Although modern debuggers and tracing tools can do a remarkable job, sometimes instrumenting the code is the only way to glean visibility and figure out exactly what is happening.

  The usual way to accommodate this need is using pre-processor directives, as before, but using a symbol to switch them on and off:

  #ifdef DEBUG_TRACE

  #endif

  So, when the symbol DEBUG_TRACE is defined, the debug code is included.

  A slightly different approach is to code it like this:

  #ifndef NDEBUG

  #endif

  Although this double negative does seem confusing, some consistency is introduced, as this symbol is used to enable the standard assert() macro. The symbol needs to be defined to suppress debug mode.

  审核编辑:郭婷

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分