8

我正在寻找编写一些高质量的 C 代码。有人可以指点我一些文章,网站..无论我需要什么例子。我已经看过并阅读了 K&R C 的书。

但是时代已经变了,肯定有人对质量 C 代码有更多的话要说。另一个重要的事情是你如何确保你作为程序员编写了高质量的 C 代码?

4

11 回答 11

11

有人提到了一些编译器开关,但语法流畅的代码并不能确保最终产品的质量,因为软件质量远不止这些。

软件质量有几种分类,但这里有一个列表,您可以将其用作清单:

  • 正确性(它是否按照规范工作?)
  • 可靠性(用户可以依赖它吗?)
  • 鲁棒性(它是否在意外情况下工作?)
  • 性能(它对用户来说是否足够快地完成工作?)
  • 可用性(用户友好吗?)
  • 可验证性(可以轻松验证其属性吗?)
  • 可维护性(可以轻松进行修改吗?)
    • 可修复性(缺陷可以在合理的时间内修复吗?)
    • 可进化性(可以简单地添加新功能吗?)
  • 可重用性(代码可以轻松地用于其他项目吗?)
  • 可移植性(能否在不同环境中轻松运行?)
  • 可理解性(维护人员可以轻松理解吗?)
  • 互操作性(它的合作程度如何?)
  • 生产力(高效和高性能的交付)
  • 及时性(按时交付的能力)
  • 可见性(所有步骤都清楚地记录了吗?)
于 2009-01-11T13:01:29.777 回答
10

在编译器中启用警告。使用 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或不使用产生警告的特定标志。

于 2009-01-11T12:41:07.523 回答
7

传统上,人们使用lint来帮助解决这个问题。

于 2009-01-11T12:43:08.597 回答
4

代码质量和大量文章、书籍、博客有很多方面

但我可以建议你作为开始:

代码完成

代码安全

于 2009-01-11T12:48:59.550 回答
4

使用静态分析工具,传统上称为 lint,但是我使用了splint,它很好。请参阅此问题中的建议。我个人建议启用警告并修复它们。

在规则方面

  • 不要信任输入数据 - 验证所有内容、大小、类型、内容。
  • 防止缓冲区溢出 - strcat 和许多其他的并不安全。
  • 使用单元测试,ddj 文章
  • 请让其他人审查您的代码
  • 不要做假设。
  • 请保持功能简短,并彻底测试每个功能。
  • 使用有意义的名称。
  • 编写可读的代码。
  • 不要偷懒——如果你需要改变某件事以使它更有意义,那就尽早而不是迟一点去做。

编辑:特定于 C,这个C 陷阱列表是必不可少的阅读,即使它适用于 C++,也值得通过CERT C++ 安全编码标准

于 2009-01-11T13:18:36.667 回答
2

之前的讨论what-are-some-good-resources-for-learning-c-beyond-kr可能指向更多(书籍)示例。

于 2009-01-11T12:52:54.473 回答
1

无论您是否在编写高质量的代码,您自己都很难判断,当然有大量的自动化和标准,但是如何应用他们所看到的一切呢?

这就是我非常喜欢将同行评审作为判断代码质量的一种方法的地方。让其他人从您的代码中看到(并学习),这将是质量的判断。

于 2009-01-11T13:06:49.890 回答
1

到目前为止,人们已经提到了工具。但是,在某个点之外,您实际上只能做一件事来真正提高您编写的代码的质量:

写代码。

于 2009-01-11T13:14:57.407 回答
1

这部分取决于您所说的“质量 C”代码是什么意思。

该程序的一个重要方面是“它是否按照它的设计目的去做”?这很难衡量,但至关重要。

然后你需要知道编译器是否可以接受代码 - 使用Cristoph提供的 GCC 编译器选项集表明代码状态良好。(虽然我会争论不休,但这取决于您的代码可能需要移动到的位置)。-Wno-long-long

代码布局很重要。人类和编译器都可以阅读代码吗?布局是否统一?它是标准格式之一吗?有几种,都有主要的追随者,只要您始终如一地使用其中一种,代码就应该没问题。评论是否恰当?这意味着评论足够多,但不要太多!该文件应该有一个标题注释,指出其中的内容 - 可能是谁编写的,也许是分发它的许可证。对此有多个问题,包括Professional #include comments。不过,按照良好的布局标准编写代码是很短时间的例行公事。

文件可能是相关的——通常是相关的。其他人怎么会知道代码存在,它做什么,如何使用它,何时使用它,何时不使用它?

代码应该使用足够好的算法编写——它不应该使用过多的内存、磁盘或 CPU 时间。它也不应该泄漏资源。将性能增强的最后一个 CPU 周期从一个例程中提取出来也是没有意义的,该例程将在每次运行程序时使用一次,持续几毫秒,当它启动时,除非你能证明它是一个性能瓶颈程序作为一个整体。

Wouter van Nifterick也给出了一套出色的指示

于 2009-01-11T13:16:51.787 回答
1

编写单元测试!

与更现代的语言相比,用 C 编写单元测试可能会更麻烦一些,但仍然非常值得。

我想说正确的单元测试是确保任何代码质量的第一方法。您可以使用所需的所有静态分析工具和代码审查,但没有什么比实际运行代码和验证结果更好的了。

于 2009-01-11T13:38:21.823 回答
0

一些强制代码质量的现代软件生命周期实践:

  • 集成测试(在项目启动时计划)
  • 代码的同行评审(在开发期间)
  • 结对编程(开发期间)
  • 使用综合库(而不是“重新发明轮子”的方法)

后一种可能特别适用于 C 语言。

于 2009-01-11T13:16:05.127 回答