在多个源文件中拆分同一标头中定义的类的定义是否合法?

时间:2013-06-24 10:17:06

标签: c++

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

这会被视为非法吗?

4 个答案:

答案 0 :(得分:5)

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

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

因此根本没有要求类的定义和实现驻留在哪些文件中。关于头文件中的内容以及实现文件中的内容的规范与最佳实践有关,而与编译器强制执行的规则无关。即,您将类定义放在头文件中,因为这样可以很容易地将它们注入到该类的实现和任何想要使用该类的代码中。

答案 1 :(得分:2)

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

然而,分离源的一个缺点是,您使编译器更难以内联小型[或仅使用一次]的函数。大多数编译器只会内联同一个编译单元中的函数。因此,如果Quad3.cpp正在使用来自Quad2.cpp的东西,那么如果它们在同一个文件中,它可能会被内联,但如果它们在单独的文件中则不会。然而,这不应该成为你设计的决定性因素 - 只是将其作为“让我们拆分”的副作用之一。

答案 2 :(得分:1)

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

请记住:编写#include <some_header.h>就像将标题的完整内容复制到该位置的源文件中一样。如果您在源文件Quad2.hQuad3.h中都包含Quad2.cppQuad3.cpp,那么这将产生完全相同的效果,就好像您已将两个标头放入一个文件{{ 1}}并包含在Quad.h文件中。使用标头和实现文件对只是一个常规问题(这是一个很好的问题)。

答案 3 :(得分:1)

试一试,亲眼看看吧!但不,这不是非法的。为方便起见,一种让人们感到困惑的方法(恕我直言)将是Quad2.h和.cpp,Quad3.h和.cpp,并在Quad.h中同时包含Quad2.h和Quad3.h。

没有什么可以强迫你,但是试图保持模式X.h与X.cpp相关联,这是常见的做法。