在设计C项目时,有没有什么已知的设计原则、最佳实践和设计模式可以遵循?或者一般的过程性(命令性)编程的有用设计原则?

(我是‘面向对象一代’的子元素,第一次要设计一个大的C项目)

推荐答案

Information hiding - as espoused by Parnas (Software Fundamentals).

仔细管理标题和可见性:

  • 源文件中可以对外部世界隐藏的所有内容都应:;只有记录在案的外部接口才应公开.
  • 公开的所有内容都在标头中声明.
  • 该标头用于需要该功能的地方(以及定义该功能的地方).
  • 标题是自包含的——当你需要它时,你可以使用它,你不必担心"我还必须包含哪些其他标题",因为标题通过包含使其工作所需的任何内容来确保其工作.
  • 标头是self 保护的,所以多次包含它并不重要.

    #ifndef HEADER_H_INCLUDED
    #define HEADER_H_INCLUDED
    ...rest of header contents, including other #include lines if necessary
    #endif /* HEADER_H_INCLUDED */
    
  • 设计用于处理"对象"(通常是 struct )的函数集,并使用这些函数,而不是在使用它的代码中窥探 struct 的内部.可以将其视为self 强加的封装.

C++相关问答推荐

Ebpf内核代码:permission denied:invalid access to map value

在函数中使用复合文字来初始化C语言中的变量

我编译了一个新的c程序,并收到以下错误

为什么我一直收到分段错误?

我怎么才能用GCC编译一个c库,让它包含另一个库呢?

在基本OpenGL纹理四边形中的一个三角形中进行渲染

防止规范模式在C++中 echo 特殊字符

致命错误:ASM/rwan ce.h:没有这样的文件或目录.符号链接还不够

-Wnonnull-Compare警告不是具有误导性吗?

Zlib:解压缩大文件导致";无效代码长度设置";错误

为什么Linux无法映射这个PT_LOAD ELF段?

CS50 pset 5的皱眉脸正确地处理了大多数基本单词,并且拼写判断不区分大小写.

unions 的原子成员是个好主意吗?

存储和访问指向 struct 的指针数组

通过char*访问指针的对象表示是未定义的行为吗?

atoi函数最大长-长误差的再创造

如何使crc32的结果与cksum匹配?

将char*铸造为空**

GCC认为这是一个VLA是对的吗?

`void foo(int a[static 0]);` 有效吗?