在同一个头文件中定义的类的定义是否可以拆分到多个源文件中?这样做是否合法?

5
在C++中,允许在多个源文件中拆分同一头文件中定义的类的定义吗?例如,如果我有一个定义了Quad2和Quad3类的文件,我可以将Quad2类定义在名为Quad2.cpp的文件中,将Quad3类定义在名为Quad3.cpp的文件中,但仍然在同一头文件Quad.h中保留两个类吗?
这样做是否被认为是不合法的?

2
听起来你是在不同的文件中实现了不同的类,而不是将一个类分割成几个文件。 - Marcelo Cantos
没错,我想更好的措辞应该是你是否可以将同一头文件中定义的类的定义拆分到多个源文件中。感谢您的评论,我会更新问题。 - teddy
4个回答

5
可以在不同的实现文件中实现同一个头文件中的不同类。
头文件只是在编译时注入源代码中的文本内容,编译器本身完全不了解头文件。头文件在预处理阶段解析,在编译器看到任何东西之前就已经完成了。
因此,并没有任何规定类的定义和实现应该存在于哪个文件中。关于哪些内容应该放在头文件中,哪些应该放在实现文件中的最佳实践的规范,与编译器执行的规则无关。即,将类定义放在头文件中是因为这使得它们易于注入到该类的实现和任何要使用该类的代码中。

2

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

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


1
那是完全有效的。您可以将函数定义分布在不同的源文件中。连接器会将所有内容放在一起,并在找不到定义时进行投诉。
请记住:编写#include <some_header.h>就像将头文件的完整内容复制到该位置的源文件中。如果您将Quad2.hQuad3.h包含在两个源文件Quad2.cppQuad3.cpp中,则这将产生完全相同的效果,就好像您将两个头文件放入一个Quad.h文件中并在cpp文件中代替它们。使用头文件和实现文件对的方法只是一种惯例(而且是一个好习惯)。

1

只需尝试并亲自体验!但不,这不是非法的。一个更少让人困惑的方法(在我看来)是拥有Quad2.h和.cpp、Quad3.h和.cpp,并在Quad.h中包含Quad2.h和Quad3.h以方便使用。

没有强制要求你这样做,但尽量保持X.h与X.cpp相关联的模式,这是常见做法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接