我正在寻找编写一些高质量的 C 代码。有人可以指点我一些文章,网站..无论我需要什么例子。我已经看过并阅读了 K&R C 的书。
但是时代已经变了,肯定有人对质量 C 代码有更多的话要说。另一个重要的事情是你如何确保你作为程序员编写了高质量的 C 代码?
我正在寻找编写一些高质量的 C 代码。有人可以指点我一些文章,网站..无论我需要什么例子。我已经看过并阅读了 K&R C 的书。
但是时代已经变了,肯定有人对质量 C 代码有更多的话要说。另一个重要的事情是你如何确保你作为程序员编写了高质量的 C 代码?
有人提到了一些编译器开关,但语法流畅的代码并不能确保最终产品的质量,因为软件质量远不止这些。
软件质量有几种分类,但这里有一个列表,您可以将其用作清单:
在编译器中启用警告。使用 gcc,我使用这些标志:
-std=c99 -pedantic -Wall -Wextra -Werror -Wmissing-prototypes
-Wmissing-declarations -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings
-Wredundant-decls -Wnested-externs -Winline -Wno-long-long -Wconversion
-Wstrict-prototypes
如果您的代码无法更改为不产生警告,请删除-Werror
或不使用产生警告的特定标志。
传统上,人们使用lint来帮助解决这个问题。
使用静态分析工具,传统上称为 lint,但是我使用了splint,它很好。请参阅此问题中的建议。我个人建议启用警告并修复它们。
在规则方面
编辑:特定于 C,这个C 陷阱列表是必不可少的阅读,即使它适用于 C++,也值得通过CERT C++ 安全编码标准
之前的讨论what-are-some-good-resources-for-learning-c-beyond-kr可能指向更多(书籍)示例。
无论您是否在编写高质量的代码,您自己都很难判断,当然有大量的自动化和标准,但是如何应用他们所看到的一切呢?
这就是我非常喜欢将同行评审作为判断代码质量的一种方法的地方。让其他人从您的代码中看到(并学习),这将是质量的判断。
到目前为止,人们已经提到了工具。但是,在某个点之外,您实际上只能做一件事来真正提高您编写的代码的质量:
写代码。
这部分取决于您所说的“质量 C”代码是什么意思。
该程序的一个重要方面是“它是否按照它的设计目的去做”?这很难衡量,但至关重要。
然后你需要知道编译器是否可以接受代码 - 使用Cristoph提供的 GCC 编译器选项集表明代码状态良好。(虽然我会争论不休,但这取决于您的代码可能需要移动到的位置)。-Wno-long-long
代码布局很重要。人类和编译器都可以阅读代码吗?布局是否统一?它是标准格式之一吗?有几种,都有主要的追随者,只要您始终如一地使用其中一种,代码就应该没问题。评论是否恰当?这意味着评论足够多,但不要太多!该文件应该有一个标题注释,指出其中的内容 - 可能是谁编写的,也许是分发它的许可证。对此有多个问题,包括Professional #include comments。不过,按照良好的布局标准编写代码是很短时间的例行公事。
文件可能是相关的——通常是相关的。其他人怎么会知道代码存在,它做什么,如何使用它,何时使用它,何时不使用它?
代码应该使用足够好的算法编写——它不应该使用过多的内存、磁盘或 CPU 时间。它也不应该泄漏资源。将性能增强的最后一个 CPU 周期从一个例程中提取出来也是没有意义的,该例程将在每次运行程序时使用一次,持续几毫秒,当它启动时,除非你能证明它是一个性能瓶颈程序作为一个整体。
Wouter van Nifterick也给出了一套出色的指示。
编写单元测试!
与更现代的语言相比,用 C 编写单元测试可能会更麻烦一些,但仍然非常值得。
我想说正确的单元测试是确保任何代码质量的第一方法。您可以使用所需的所有静态分析工具和代码审查,但没有什么比实际运行代码和验证结果更好的了。