将C++文件合并为单个源文件

Merge C++ files into a single source file

本文关键字:单个 源文件 合并 C++ 文件      更新时间:2023-10-16

我有一个包含多个源文件和多个头文件的 c++ 项目。 我想提交我的项目参加一个需要单一源文件的编程竞赛。有没有一种将所有文件折叠成单个.cpp文件的自动方法?

例如,如果我有 a.cpp、a.h、b.cpp、b.h 等,我想得到一个 main.cpp它将成功编译和运行。 如果我手动执行此操作,我可以简单地合并头文件并将源文件相互附加吗? 外部外部是否有陷阱,包括依赖项和前向声明?

我也需要这个来参加编码比赛。准确地说是科丁加姆。所以我写了一个快速的JavaScript脚本来解决这个问题。你可以在这里找到它: https://www.npmjs.com/package/codingame-cpp-merge

我在 1 场现场比赛和一场离线比赛中使用了它,它从未产生过糟糕的结果。随时在 github 上提出更改建议或提出拉取请求!

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

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

嗯,这是可能的,我见过很多项目将源文件合并为单个.h和.c/.cpp,例如sqlite

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

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

以下是一些示例

盖克利布源码包工具

CIL实用程序能够做到这一点:

$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及其缺点的文档。Mac OS XLinux的二进制分布提供了Tigress

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

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

// STL headers

// --- prototype
// monster.h
// prince.h
// --- implementation
int main() { 
// your main function
return 0;
}

我刚刚找到了一个非常适合我的 npm 包,正是为了海豚:cpp 合并

我提供链接:https://www.npmjs.com/package/cpp-merge

要安装: npm install -g cpp-merge

要使用: cpp-merge file.cpp

这将创建一个合并文件,其中包含 #include "library.cpp" 中指定的所有文件,在 file.cpp 中。

另外,值得一提的是,它进入标准输出。要将其定向到文件,您可以执行以下操作:

cpp-merge --output output.cpp

查看文档以获取更多详细信息!

我不知道有什么

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

如果您选择发送单个文件而不是压缩存档,例如压缩包或 zip 文件,则可能应考虑一些事项。

首先,将

文件连接在一起,正如托马斯·马修斯已经提到的。只需进行一些更改,通常即可编译一个文件。删除不存在的 #include 语句,例如现在包含的标头。

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

话虽如此,我认为共享代码的最佳方式是通过公共存储库,例如 GitHub.com 或压缩存档。