对'的建议;C';项目架构指南?
现在,我已经将注意力集中在“C”语言上,我觉得自己已经足够熟练地编写干净的代码了,我想把注意力集中在项目架构指南上。我正在寻找一个好的资源,包括以下主题:对'的建议;C';项目架构指南?,c,architecture,coding-style,C,Architecture,Coding Style,现在,我已经将注意力集中在“C”语言上,我觉得自己已经足够熟练地编写干净的代码了,我想把注意力集中在项目架构指南上。我正在寻找一个好的资源,包括以下主题: 如何创建一个接口,以提高代码的可维护性,并为将来的升级提供可扩展性 图书馆创建指南。例如,什么时候应该考虑使用静态VS动态库。如何正确地设计一个ABI来处理任何一个 头文件:分区内容和时间。关于何时使用1:1 vs 1:many.h到.c的示例 您觉得我遗漏了但在尝试构建新的C项目时很重要的任何内容 理想情况下,我希望看到一些从小到大的示例项
<>这是我能给你的一些小提示。 < P>每当我认真编写C代码时,我就不得不模仿C++中的特性。值得做的主要工作是:
- 将每个模块看作一个类。在标头中公开的函数类似于公共方法。仅当函数是模块所需接口的一部分时,才将其放在标题中
- 避免循环模块依赖关系。模块A和模块B不应相互呼叫。您可以将某些内容重构为模块C以避免这种情况
- 避免使用模块范围变量——前面描述的模式通常会满足您的需要。但是,如果您确实需要模块范围变量,请将它们分组到存储在单个模块范围变量“m”中的结构下或一致的结构下。然后在您的代码中,每当您看到“m.variable”时,您一眼就会知道它是模块作用域结构之一
- 为避免标题问题,请将#ifndef MY#u header#H#定义防止双重包含的MY#u header#H声明。模块的头文件.h应仅包含该头文件所需的#includes。c文件可以包含编译模块所需的更多包含,但不要将这些包含添加到模块头文件中。这将避免许多名称空间冲突和包含顺序问题
对于库来说,可重入性也很重要。不要依赖于未划分的全局状态(如果需要,您可以使用typedef struct令牌来保持此状态)。关于系统架构的真理是永恒的,它们跨越语言边界。下面是一个关于C的小建议:
- 每个模块都隐藏着一个秘密。围绕对客户端隐藏信息的界面构建系统。C唯一的类型安全信息隐藏结构是指向不完整结构的指针。深入学习并经常使用
- 实现的一个接口是一个很好的经验法则。(接口是.h,实现是.c。)有时您需要提供两个与同一个实现相关的接口:一个隐藏表示,另一个公开表示
- 您需要命名约定
- 使用s
- 如果需要“private”函数,请将其声明为static,不要将其放在.h文件中