将C ++文件合并到单个源文件中

时间:2011-05-13 17:45:56

标签: c++

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

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

8 个答案:

答案 0 :(得分:4)

我还需要这个用于编码比赛。确切地说是Codingame。所以我写了一个快速的JavaScript脚本来做这个伎俩。你可以在这里找到它:  https://www.npmjs.com/package/codingame-cpp-merge

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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

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

// STL headers


// --- prototype
// monster.h

// prince.h

// --- implementation

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

答案 5 :(得分:0)

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

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

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

这是一些例子

gaclib source pack tool

答案 6 :(得分:-2)

您可以使用github。它是一个版本控制系统,您可以通过这种方式与您分享代码。 这样,您的代码仍然会被组织(标题和来源),这使得每个人(包括与之共享的人)更容易阅读。

编辑:不幸的是,它无法执行下载文件等简单任务。我不知道可以合并你想要的文件的工具,但你可能想看看CodeSmith Studio。这是一个学习曲线,但如果正确使用它会非常有效。

答案 7 :(得分:-2)

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

首先,如Thomas Matthews所述,将文件连接在一起。通过一些更改,您通常可以编译一个文件。删除不存在的#include语句,例如现在已包含的标题。

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

话虽这么说,我认为共享代码的最佳方式是通过公共存储库,例如GitHub.comcompressed archive