看看戈达德太空飞行中心(NASA)的C编码标准(在这URL http://software.gsfc.nasa.gov/assetsbytype.cfm?TypeAsset=Standard)。它有一些很好且有趣的指南。
我为自己的代码采用的一项具体准则是,标头应该是独立的。也就是说,你应该能够写:
#include "header.h"
并且代码应该正确编译,并包含任何其他必要的标头,无论之前发生了什么。确保这一点的简单方法是将标头包含在实现源中——作为第一个标头。如果编译成功,则标头是独立的。如果无法编译,请进行修复以使其能够编译。当然,这还要求您确保标头是幂等的 - 无论包含它们的频率如何,其工作原理都是相同的。也有一个标准的习语:
#ifndef HEADER_H_INCLUDED
#define HEADER_H_INCLUDED
...operational body of header.h...
#endif /* HEADER_H_INCLUDED */
当然,#define 必须位于文件顶部,而不是底部。否则,如果其中包含的标头也包含 header.h,那么您最终会陷入无限循环 - 不健康。即使您决定采用以下策略:
#ifndef HEADER_H_INCLUDED
#include "header.h"
#endif /* HEADER_H_INCLUDED */
在包含标头的代码中 - 一种做法是not推荐 - 将守卫包含在标头本身中也很重要。
更新2011-05-01
上面的 GSFC URL 不再有效。您可以在问题的答案中找到更多信息我应该在标题中使用 #include https://stackoverflow.com/questions/1804486/should-i-use-include-in-headers,其中还包含对此问题的交叉引用。
更新2012-03-24
所引用的 NASA C 编码标准可以通过互联网档案访问和下载:
http://web.archive.org/web/20090412090730/http://software.gsfc.nasa.gov/assetsbytype.cfm?TypeAsset=Standard http://web.archive.org/web/20090412090730/http://software.gsfc.nasa.gov/assetsbytype.cfm?TypeAsset=Standard