我有一个大的C ++文件(SS.cpp),我决定将其拆分为较小的文件,以便我可以在不需要阿司匹林的情况下进行导航。所以我创建了
SS_main.cpp
SS_screen.cpp
SS_disk.cpp
SS_web.cpp
SS_functions.cpp
并将初始SS.cpp文件中的所有函数剪切粘贴到它们。
最后我将它们包含在原始文件中:
#include "SS_main.cpp"
#include "SS_screen.cpp"
#include "SS_disk.cpp"
#include "SS_web.cpp"
#include "SS_functions.cpp"
这种情况现在仍然持续几个月,这些都是我遇到的问题:
整个解决方案搜索(VS中的Shift-Ctrl-F)不会搜索包含的文件,因为它们未列为源文件。
我必须手动指出它们是否包含Subversion。
你认为当文件变得非常大时,在其他来源中包含源文件是一种公认的解决方法吗?我应该说,在较小的类中拆分实现的类不是一个选项。
答案 0 :(得分:9)
有时可以包含实现文件,但这听起来不像其中之一。通常,这仅在处理某些自动生成的文件时有用,例如MIDL编译器的输出。作为大文件的解决方法,没有。
您应该将所有这些源文件添加到项目中,而不是#including它们。将大型类拆分为多个实现文件没有任何问题,只需将它们添加到项目中,包括它们就像没有多大意义一样。
- 此外,作为FYI,您可以将文件添加到项目中,然后指示编译器忽略它们。这样他们仍然可以搜索。为此,将文件添加到项目中,然后右键单击它,然后转到“属性”,并在“常规”下将“从生成中排除”设置为“是”。
答案 1 :(得分:8)
不要在其他文件中包含cpp文件。您不必在一个文件中定义每个类函数,您可以将它们分布在多个文件中。只需将它们单独添加到项目中,然后单独编译它们。
答案 2 :(得分:4)
您不包含实现(.cpp)文件。为包含函数/类声明的这些实现文件创建头文件,并根据需要包含这些文件。
答案 3 :(得分:3)
实际上,您有时会想要包含CPP文件。这里有几个关于Unity Builds讨论这个主题的问题。
答案 4 :(得分:2)
您需要了解 Separate compilation ,链接以及标题文件的用途。
您需要为每个模块创建一个头文件(可能除main.cpp外)。头文件将包含每个.cpp源文件的声明部分,而.cpp文件本身将包含实例部分。然后可以单独编译和链接每个单元。例如:
<强>的main.cpp 强>
#include "function.h"
int main()
{
func1() ;
}
<强> function.h 强>
#if !defined FUNCTION_H
#define FUNCTION_H
extern void func1() ;
#endif
<强> function.cpp 强>
void func1()
{
// do stuff
}
然后将function.cpp和main.cpp分别编译(通过将它们添加到项目的源代码中),然后进行链接。头文件是必需的,这样编译器就可以知道func1()的接口,而无需查看完整的定义。标题应添加到项目标题中,然后您会发现源浏览器和自动完成等工作正常。
答案 5 :(得分:2)
这个问题困扰我的是它的背景。
已经创建了一个大的cpp文件,其大小足以保证将其分成更小的更易于管理的文件。建议的拆分是:
SS_main.cpp
SS_screen.cpp
SS_disk.cpp
SS_web.cpp
SS_functions.cpp
这似乎表明,从规范和设计的角度来看,存在单独的功能单元。我们只能猜测这些代码单元之间的耦合。
然而,定义这些代码单元将是一个开始,这样每个新的cpp文件都有自己的头文件,从而定义这些单元的接口和它们之间的(低)耦合,以实现每个单元的(高)内聚
我们在这里重构。
在此上下文中使用包含的cpp文件是不可接受的,因为它没有任何优势。我遇到包括cpp文件的唯一一次是当包含一个提供调试代码的代码时,例如编译非内联版本的函数。它有助于逐步调试调试器中的代码。