合并C++;将文件转换为单个源文件 我有一个C++项目,有多个源文件和多个头文件。我想提交一个编程比赛,需要一个单一的源文件我的项目。是否有一种自动将所有文件折叠成单个.cpp文件的方法

合并C++;将文件转换为单个源文件 我有一个C++项目,有多个源文件和多个头文件。我想提交一个编程比赛,需要一个单一的源文件我的项目。是否有一种自动将所有文件折叠成单个.cpp文件的方法,c++,C++,例如,如果我有a.cpp、a.h、b.cpp、b.h等,我想得到一个main.cpp,它将成功编译并运行。如果我手动执行此操作,是否可以简单地合并头文件并将源文件附加到彼此?外部程序、包含依赖项和转发声明是否存在漏洞?我不知道有哪种工具可以将.cpp文件组合在一起,但我只是将所有文件压缩在一起,并将它们作为gzip文件发送过来。一般来说,您不能这样做。虽然您可以愉快地将头文件的内容粘贴到相应的#includes位置,但通常不能简单地连接源文件。对于初学者,您可能会在具有文件范围的事物之间产生命名

例如,如果我有a.cpp、a.h、b.cpp、b.h等,我想得到一个main.cpp,它将成功编译并运行。如果我手动执行此操作,是否可以简单地合并头文件并将源文件附加到彼此?外部程序、包含依赖项和转发声明是否存在漏洞?

我不知道有哪种工具可以将.cpp文件组合在一起,但我只是将所有文件压缩在一起,并将它们作为gzip文件发送过来。

一般来说,您不能这样做。虽然您可以愉快地将头文件的内容粘贴到相应的
#include
s位置,但通常不能简单地连接源文件。对于初学者,您可能会在具有文件范围的事物之间产生命名冲突。假设您将粘贴的头文件(带有类定义等)复制到每个源文件中,那么最终将得到多次定义的类


有更好的解决办法。如前所述,为什么不简单地压缩整个项目目录(在清除自动生成的对象文件等之后)?如果你真的必须有一个单一的源文件,那么只需要写一个单一的源文件

我认为有标题、源文件的项目一定比只有一个主文件的项目更好。不仅易于使用和阅读,而且他们知道您在分离程序模块方面做得很好

由于您的解决方案,我提供了这种格式,我认为您必须手工操作:

// STL headers


// --- prototype
// monster.h

// prince.h

// --- implementation

int main() { 
// your main function
return 0;
}

如果你选择发送一个单独的文件而不是一个压缩的存档文件,比如一个TARBARE或一个zip文件,你可能需要考虑一些事情。 首先,如托马斯·马修斯(Thomas Matthews)所述,将这些文件连接在一起。通过一些更改,您通常可以编译一个文件。删除不存在的

#include
语句,例如现在包含的标题

您还必须按照各自的依赖顺序连接这些文件。也就是说,如果a.cpp需要在b.hpp中声明一个类,那么您很可能需要按照Thomas Matthews列出的顺序进行连接


话虽如此,我认为共享代码的最佳方式是通过公共存储库,如or。

好吧,这是可能的,我看到许多项目将源文件合并到单个.h和.c/.cpp,如sqlite

但是代码必须有一些限制,比如在一个源代码中不应该有静态全局变量

可能没有用于合并源代码的通用工具。您应该基于代码编写一个

这里有一些例子


我还需要这个来参加编码比赛。请告诉我准确的答案。因此,我编写了一个快速JavaScript脚本来实现这一技巧。你可以在这里找到它:

我曾在一场现场比赛和一场线下比赛中使用过它,但从未产生过不好的结果。您可以在github上随意提出更改建议或请求拉取

该实用程序可以执行以下操作:

$TIGRESS_HOME/cilly --merge -c x1.c -o x1.o
$TIGRESS_HOME/cilly --merge -c x2.c -o x2.o
$TIGRESS_HOME/cilly --merge -c x3.c -o x4.o
$TIGRESS_HOME/cilly --merge  --keepmerged x1.o x2.o x3.o -o merged --mergedout=merged.c

使用示例取自。阅读有关CIL及其缺点的文档

太多的答案都是“回避”这个问题。我无法压缩我的项目,因为在线评委希望编译和运行单个cpp文件。解决方案是更改评委。法官应该关心找到一个makefile以及makefile的输出(比如,可执行文件的名称)。当然,这对你来说并不舒服。我的建议是:使用像/E for VC 2015这样的编译器选项,只执行预处理器。工作原理:生成一个.cpp文件,其中包括项目的所有.cpp文件(没有.h文件!)。然后使用/E选项编译这个.cpp文件。结果(stdout)是一个.cpp文件,其中包含整个项目。这不方便,输出也不是真正的美。但是,它是有效的。我同意,cpp文件仅用于提交。我之所以有多个文件,是因为它更容易理解和编辑,但最终的输出必须是一个cpp文件。这不是编程竞赛的工作方式。