5

在 C++ 中,您是否允许将在同一个头文件中定义的类的定义拆分到多个源文件中?例如,如果我有一个定义类 Quad2 和 Quad3 的文件,我可以在一个名为 Quad2.cpp 的文件中定义类 Quad2 并在一个名为 Quad3.cpp 的文件中定义 Quad 3,但它们仍然在同一个头文件 Quad.h 中吗?

这会被认为是非法的吗?

4

4 回答 4

5

是的,您可以在不同的实现文件中从同一个头文件实现不同的类。

头文件只不过是在编译时注入源代码的文本内容。编译器本身绝对没有标题的概念。在编译器看到任何东西之前,头文件在预处理器中被解析。

因此,根本不需要类的定义和实现驻留在哪些文件中。关于什么属于头文件和什么属于实现文件的规范与最佳实践有关,与编译器强制执行的规则无关。即,您将类定义放在标头中,因为这使它们易于注入到该类的实现和任何想要使用该类的代码中。

于 2013-06-24T10:26:39.470 回答
2

是的,完全合法。实际上,如果您想将代码拆分为较小的文件,您可以拥有 Quad2A.cpp 和 Quad2B.cpp(当然,这样做可能没有任何好处)。

然而,分离源代码的一个缺点是编译器更难内联较小的函数(或仅使用一次)。大多数编译器只会内联同一编译单元中的函数。因此,如果 Quad3.cpp 使用的是 Quad2.cpp 中的某些内容,那么如果它们在同一个文件中,则它可能会被内联,但如果它们在不同的文件中则不会。但是,这不应该是您设计的真正决定因素 - 只是将其作为“让我们分开”的副作用之一提及。

于 2013-06-24T10:23:13.437 回答
1

这完全有效。您可以在不同的源文件中广泛分布您的函数定义。如果找不到定义,链接器会将所有内容放在一起并抱怨。

记住:写作#include <some_header.h>就像是把头文件的完整内容复制到那个地方的源文件中。如果您在两个源文件中都包含Quad2.hand ,那么这将产生完全相同的效果,就好像您将两个头文件放入一个文件并将其包含在文件中一样。使用成对的头文件和实现文件只是一个约定问题(这是一个很好的约定)。Quad3.hQuad2.cppQuad3.cppQuad.hcpp

于 2013-06-24T10:21:47.583 回答
1

试试看吧!但不,这并不违法。一种可以减少人们混淆的方法(恕我直言)是使用 Quad2.h 和 .cpp、Quad3.h 和 .cpp,并在 Quad.h 中包含 Quad2.h 和 Quad3.h 以方便使用。

没有什么能强迫你这样做,但尽量保持 Xh 与 X.cpp 相关联的模式,这是常见的做法。

于 2013-06-24T10:22:20.730 回答