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

问题描述 投票:19回答:7

我有一个带有多个源文件和多个头文件的c ++项目。我想将我的项目提交给需要单个源文件的编程竞赛。是否有一种自动方式将所有文件折叠为单个.cpp文件?

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

c++
7个回答
5
投票

我在编码竞赛中也需要这个。准确地说,Codingame。因此,我编写了一个快速的JavaScript脚本来解决这个问题。你可以在这里找到它:https://www.npmjs.com/package/codingame-cpp-merge

我在1场现场比赛和1个离线游戏中使用了它,但从未产生不良结果。欢迎在github上提出更改建议或提出拉取请求!


1
投票

通常,您不能这样做。尽管您可以很高兴地将头文件的内容粘贴到相应的#include的位置,但是通常不能简单地串联源文件。对于初学者,您可能最终会在文件范围的事物之间命名冲突。鉴于您将在每个源文件中添加粘贴复制的头文件(带有类定义等),因此最终将获得多次定义的类。

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


1
投票

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

但是代码必须有一些限制,例如您的源代码之一中不应包含静态全局变量。

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

这里有一些例子

gaclib source pack tool


1
投票

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

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 的使用示例。阅读有关here及其缺点CIL的文档。 here


0
投票

我不知道将.cpp文件组合在一起的工具,但我只是将所有文件压缩在一起并作为gzip文件发送。


0
投票

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

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

A binary distribution for Mac OS X and Linux is provided with Tigress

-2
投票

如果选择发送单个文件而不是压缩文件,例如tarball或zip文件,则可能需要考虑一些事项。

[首先,将文件串联在一起,正如Thomas Matthews所述。进行少量更改后,通常可以编译一个文件。删除不存在的Mac OS X语句,例如现在已包含的标题。

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

话虽如此,我认为共享代码的最佳方法是通过公共存储库,例如LinuxTigress // STL headers // --- prototype // monster.h // prince.h // --- implementation int main() { // your main function return 0; }


-3
投票

您可以使用#include。这是一个版本控制系统,您可以通过这种方式共享代码。这样,您的代码仍将井井有条(标题和源代码),这使所有人(包括与您共享的人)都更容易阅读。

Edit

:很遗憾,它无法执行诸如下载文件之类的简单任务。我不知道可以根据需要合并文件的工具,但是您可能想看看GitHub.com。这是一个学习曲线,但是如果正确使用它会非常有效。
© www.soinside.com 2019 - 2024. All rights reserved.