合并头文件和cpp文件 我正在研究一个C++项目,我把每个类都实现为一个单独的.h文件和.cpp文件。我发现这不值得这么麻烦。 -我在两个文件之间来回编辑 -它给我带来了很多意想不到的麻烦(不得不添加预声明,显式导出模板类) -我看不到直接的好处,我的代码库一定会相对较小(比如>abc.cpp 2。cat*.cpp>>abc.cpp 3。g++abc.cpp:pyu可能忽略了一个事实,即客户端无法查看您的实现。可能每个cpp/hpp都有一个类也会带来麻烦。C++中的好实践允许将多个相关类分组在自己的HPP/CPP对中。如果有多个头文件和代码文件是完全麻烦的,那么您应该把所有代码放在一个文件中。毕竟,现在的任何编辑都不会有问题/sarcasm即使是这样做的诱惑,也是对编译过程工作原理的根本误解。看看编译单元和编译阶段(预处理器,它将处理一些包含、编译器、链接器)的定义,或者至少是一些细分,将很快说明为什么这是一个非常糟糕的主意。正如乔纳森在回答中指出的那样,#include从字面上将文件的文本包含到另一个文件中。如果您使用的是MSVC,那么有一个选项可以保留预处理器的输出(*.i),这将进一步说明这一点。1。cat*.h>>abc.cpp 2。cat*.cpp>>abc.cpp 3。g++abc.cpp:PSometimes您想要的类仅是一个cpp文件的本地类。这可以是为了简单(没有其他文件需要它),也可以是为了隐藏实现/复杂性。因此,您不应该总是在头文件中包含声明—仅当您希望公开该类以便在其他地方使用它时。@AlexWilson有时您需要使用decla

合并头文件和cpp文件 我正在研究一个C++项目,我把每个类都实现为一个单独的.h文件和.cpp文件。我发现这不值得这么麻烦。 -我在两个文件之间来回编辑 -它给我带来了很多意想不到的麻烦(不得不添加预声明,显式导出模板类) -我看不到直接的好处,我的代码库一定会相对较小(比如>abc.cpp 2。cat*.cpp>>abc.cpp 3。g++abc.cpp:pyu可能忽略了一个事实,即客户端无法查看您的实现。可能每个cpp/hpp都有一个类也会带来麻烦。C++中的好实践允许将多个相关类分组在自己的HPP/CPP对中。如果有多个头文件和代码文件是完全麻烦的,那么您应该把所有代码放在一个文件中。毕竟,现在的任何编辑都不会有问题/sarcasm即使是这样做的诱惑,也是对编译过程工作原理的根本误解。看看编译单元和编译阶段(预处理器,它将处理一些包含、编译器、链接器)的定义,或者至少是一些细分,将很快说明为什么这是一个非常糟糕的主意。正如乔纳森在回答中指出的那样,#include从字面上将文件的文本包含到另一个文件中。如果您使用的是MSVC,那么有一个选项可以保留预处理器的输出(*.i),这将进一步说明这一点。1。cat*.h>>abc.cpp 2。cat*.cpp>>abc.cpp 3。g++abc.cpp:PSometimes您想要的类仅是一个cpp文件的本地类。这可以是为了简单(没有其他文件需要它),也可以是为了隐藏实现/复杂性。因此,您不应该总是在头文件中包含声明—仅当您希望公开该类以便在其他地方使用它时。@AlexWilson有时您需要使用decla,c++,header-files,C++,Header Files,我的问题有两个方面 a) 将实现和原型分开是否有我可能错过的好处 b) 如果没有,是否有任何免费工具或ide能够将cpp文件合并回头文件?不要这样做。对于大多数简单类,如果您希望公开该类以供其他地方使用,则应始终*在.h头文件中声明该类,并在.cpp文件中定义(代码) 然后,您可以将.h文件包含在希望使用该类的任何位置(即实例化它)。但是,链接器负责在单独编译每个.cpp后将代码“链接”起来 我要问你的问题是,“否则你会怎么做?”我看到许多N00B犯的一个错误是#包括“foo.c。然后发生的情况

我的问题有两个方面

a) 将实现和原型分开是否有我可能错过的好处


b) 如果没有,是否有任何免费工具或ide能够将cpp文件合并回头文件?

不要这样做。对于大多数简单类,如果您希望公开该类以供其他地方使用,则应始终*在
.h
头文件中声明该类,并在
.cpp
文件中定义(代码)

然后,您可以将
.h
文件包含在希望使用该类的任何位置(即实例化它)。但是,链接器负责在单独编译每个
.cpp
后将代码“链接”起来

我要问你的问题是,“否则你会怎么做?”我看到许多N00B犯的一个错误是
#包括“foo.c
。然后发生的情况是,不仅会丢失独立编译,还会在链接时遇到问题,因为同一个类有多个定义。请记住,当你包含一个文件时,它会在你所说的文件正文中出现

[*]这条规则当然有例外:


模板类是一个例外。它们必须全部位于头文件中。原因是,在使用类型参数实例化类之前,不会生成实际代码。然后,编译器在需要时用指定的类型“填充”类的主体。由于该类型在此之前是未知的,因此无法单独编译并在以后链接。

不要这样做。对于大多数简单类,如果您希望公开该类以供其他地方使用,则应始终*在
.h
头文件中声明该类,并在
.cpp
文件中定义(代码)

然后,您可以将
.h
文件包含在希望使用该类的任何位置(即实例化它)。但是,链接器负责在单独编译每个
.cpp
后将代码“链接”起来

我要问你的问题是,“否则你会怎么做?”我看到许多N00B犯的一个错误是
#包括“foo.c
。然后发生的情况是,不仅会丢失独立编译,还会在链接时遇到问题,因为同一个类有多个定义。请记住,当你包含一个文件时,它会在你所说的文件正文中出现

[*]这条规则当然有例外:


模板类是一个例外。它们必须全部位于头文件中。原因是,在使用类型参数实例化类之前,不会生成实际代码。然后,编译器在需要时用指定的类型“填充”类的主体。由于该类型在此之前不为人所知,因此无法单独编译并在以后链接。

您可能忽略了一个事实,即客户端无法查看您的实现。可能每个cpp/hpp都有一个类也会带来麻烦。C++中的好实践允许将多个相关类分组在自己的HPP/CPP对中。如果有多个头文件和代码文件是完全麻烦的,那么您应该把所有代码放在一个文件中。毕竟,现在的任何编辑都不会有问题
/sarcasm
即使是这样做的诱惑,也是对编译过程工作原理的根本误解。看看编译单元和编译阶段(预处理器,它将处理一些包含、编译器、链接器)的定义,或者至少是一些细分,将很快说明为什么这是一个非常糟糕的主意。正如乔纳森在回答中指出的那样,
#include
从字面上将文件的文本包含到另一个文件中。如果您使用的是MSVC,那么有一个选项可以保留预处理器的输出(
*.i
),这将进一步说明这一点。1。cat*.h>>abc.cpp 2。cat*.cpp>>abc.cpp 3。g++abc.cpp:pyu可能忽略了一个事实,即客户端无法查看您的实现。可能每个cpp/hpp都有一个类也会带来麻烦。C++中的好实践允许将多个相关类分组在自己的HPP/CPP对中。如果有多个头文件和代码文件是完全麻烦的,那么您应该把所有代码放在一个文件中。毕竟,现在的任何编辑都不会有问题
/sarcasm
即使是这样做的诱惑,也是对编译过程工作原理的根本误解。看看编译单元和编译阶段(预处理器,它将处理一些包含、编译器、链接器)的定义,或者至少是一些细分,将很快说明为什么这是一个非常糟糕的主意。正如乔纳森在回答中指出的那样,
#include
从字面上将文件的文本包含到另一个文件中。如果您使用的是MSVC,那么有一个选项可以保留预处理器的输出(
*.i
),这将进一步说明这一点。1。cat*.h>>abc.cpp 2。cat*.cpp>>abc.cpp 3。g++abc.cpp:PSometimes您想要的类仅是一个cpp文件的本地类。这可以是为了简单(没有其他文件需要它),也可以是为了隐藏实现/复杂性。因此,您不应该总是在头文件中包含声明—仅当您希望公开该类以便在其他地方使用它时。@AlexWilson有时您需要使用decla