Tom*_*Tom 67
一些一般准则:
foo.cxx
,那里最好的东西最好被声明foo.h
.#include
尽可能优先于s进行前瞻性声明.这允许您打破循环标头依赖项.本质上,对于跨单独文件的循环依赖,您需要一个类似于下面的文件依赖图:
A.cxx
要求A.h
和B.h
B.cxx
要求A.h
和B.h
A.h
要求 B.h
B.h
是独立的(和定义的前向声明类A.h
)如果您的代码旨在成为其他开发人员使用的库,则还需要执行一些其他重要步骤:
include/
和src/
子目录,其中include/
包含我的所有公共头文件,并且src/
拥有我的所有源代码.和私人标题.我建议找一本John Lakos的书" 大规模C++软件设计".这是一本非常沉重的书,但如果你只是略过一些关于物理架构的讨论,你会学到很多东西.
查看NASA戈达德太空飞行中心的C和C++编码标准.我在C标准中特别注意并在我自己的代码中采用的一条规则是强制执行头文件的"独立"性质的规则.在头文件xxx.h的实现文件xxx.cpp中,确保xxx.h是包含的第一个头.如果标头在任何时候都不是自包含的,则编译将失败.这是一个非常简单而有效的规则.
它失败的唯一一次就是如果你在机器之间移植,并且xxx.h标头包括,比如说,<pqr.h>
但是<pqr.h>
需要设备恰好可以通过<abc.h>
原始平台上的标头提供(<pqr.h>
包括<abc.h>
),但设施不是通过提供<abc.h>
其他平台(他们是在def.h
代替,但<pqr.h>
不包括<def.h>
).这不是规则的错误,如果遵循规则,问题就更容易诊断和修复.
除了这里的其他一点之外,还有一点:
不要在包含文件中包含任何私有定义。例如,任何仅在 xxx.cpp 中使用的定义应该在 xxx.cpp 中,而不是 xxx.h 中。
看起来很明显,但我经常看到它。