正确布局C ++头文件

时间:2009-12-01 22:04:51

标签: c++ header

C ++ .h文件的正确布局是什么?

我的意思是标题保护,包括,typedef,枚举,结构,函数声明,类定义,类,模板等等

我正在移植一个已经超过10年的旧代码库,并且从Codewarrior 8迁移到现代编译器变得非常有趣,因为事情似乎到处都是。我得到很多不要说出类型错误,禁止声明没有类型等等。

4 个答案:

答案 0 :(得分:3)

关于如何整理标题没有灵丹妙药。 然而,一个重要的规则是在整个项目中保持一致,以便参与项目的所有人都知道会发生什么。

通常,typedef和define位于我标题中文件的顶部,但不能将其视为规则,然后是类/模板定义。

我遵循的C ++规则是每个类一个标题,这通常会使标题保持足够小,以便能够抓取内容并查找内容而不会滚动太多。

答案 1 :(得分:1)

这取决于正确的含义。如果你的意思是语言强制执行,那么真的没有。事实上,你甚至不必将它命名为“.h”。我在工作的商业代码中看到了“.c”文件#include'(保留有罪的名字被保留)。 #include只是一个预处理程序,它通过允许文件以文本方式包含其他文件来获得语言中某种粗略的模块化。你倾向于将其视为标准练习的其他任何东西都是人们随着时间的推移而发展起来的有用习语。

但这对你当前的问题没有帮助。

我猜你实际看到的是由于平台差异导致的很多缺失符号。没有任何东西可归因于奇怪形成的.h文件。

有可能编写旧代码以使用旧的K& R风格的C编译器。他们有像隐式函数声明这样的奇怪之处(对未声明的例程的任何引用都假定它返回int并且它的所有参数都是int)。您可以尝试查看您的编译器是否具有K& R标志,但许多标记的内容实际上可能是旧代码中的潜在错误。

答案 2 :(得分:1)

听起来你正在考虑基于之前实现的假设(Codewarrior)。例如:

#include <iostream>
int main() {
  std::cout << "string literal\n";
  return 0;
}

这依赖于iostream,包括不需要声明的东西:operator<<(ostream&, char const*)重载(它是一个自由函数,而不是像其他函数一样的ostream方法)。并且完全明确,上面也需要#include <ostream>。在C ++中,通常允许库头包含任何其他库头,因此每当有人无意中依赖于此时,就会出现此问题。

(在这种特殊情况下需要额外的标题被许多人认为是一个缺陷,包括我,几乎所有的实现都在iostream中提供了这个函数的声明。它仍然是我所知道的最简单,常见的例子。说明这一点。)

它通常比这个简单的例子更微妙和复杂,但核心问题是相同的。 解决方案是检查每个标头以确保它包含所需的任何库,从给出错误的库开始。例如。 #include <vector>并确保使用std::vector(以避免依赖于它在全局命名空间中,这在某些,大多是旧的和过时的实现中完成)当你得到“vector not a name a型”。

您可能也遇到dependent types,在这种情况下,您需要添加typename。

答案 3 :(得分:0)

我认为你能做的最好的事情就是检查任何库文件的布局。