我有一个带有多个源文件和多个头文件的c ++项目。我想将我的项目提交给需要单个源文件的编程竞赛。是否有一种自动方式将所有文件折叠为单个.cpp文件?
例如,如果我有a.cpp,a.h,b.cpp,b.h等,我想获得一个main.cpp,它将编译并成功运行。如果手动执行此操作,是否可以简单地合并头文件并将源文件相互附加?是否存在带有外部语句的陷阱,包括依赖项和前向声明?
我在编码竞赛中也需要这个。准确地说,Codingame。因此,我编写了一个快速的JavaScript脚本来解决这个问题。你可以在这里找到它:https://www.npmjs.com/package/codingame-cpp-merge
我在1场现场比赛和1个离线游戏中使用了它,但从未产生不良结果。欢迎在github上提出更改建议或提出拉取请求!
通常,您不能这样做。尽管您可以很高兴地将头文件的内容粘贴到相应的#include
的位置,但是通常不能简单地串联源文件。对于初学者,您可能最终会在文件范围的事物之间命名冲突。鉴于您将在每个源文件中添加粘贴复制的头文件(带有类定义等),因此最终将获得多次定义的类。
有更好的解决方案。如前所述,为什么不简单地将整个项目目录压缩(在清除自动生成的目标文件等之后)?如果确实必须有一个源文件,那么只需编写一个源文件!
嗯,这是可能的,我已经看到很多项目将源文件合并为单个.h和.c / .cpp,例如sqlite
但是代码必须有一些限制,例如您的源代码之一中不应包含静态全局变量。
可能没有用于合并源的通用工具。您应该在代码上编写一个基础。
这里有一些例子
我不知道将.cpp文件组合在一起的工具,但我只是将所有文件压缩在一起并作为gzip文件发送。
我认为带有标头,源文件的项目必须比只有一个主文件的项目好。他们不仅更易于使用和阅读,而且他们知道您在分离程序模块方面做得很好。
由于您的解决方案,我提供了这种格式,我认为您必须手工完成:
A binary distribution forMac OS X
andLinux
is provided withTigress
如果选择发送单个文件而不是压缩文件,例如tarball或zip文件,则可能需要考虑一些事项。
[首先,将文件串联在一起,正如Thomas Matthews所述。进行少量更改后,通常可以编译一个文件。删除不存在的Mac OS X
语句,例如现在已包含的标题。
您还必须按照它们各自的依赖顺序来串联这些文件。也就是说,如果a.cpp需要在b.hpp中声明的类,那么您很可能需要按照列出的Thomas Matthews的顺序进行串联。
话虽如此,我认为共享代码的最佳方法是通过公共存储库,例如Linux
或Tigress
// STL headers
// --- prototype
// monster.h
// prince.h
// --- implementation
int main() {
// your main function
return 0;
}
。
您可以使用#include
。这是一个版本控制系统,您可以通过这种方式共享代码。这样,您的代码仍将井井有条(标题和源代码),这使所有人(包括与您共享的人)都更容易阅读。
Edit
:很遗憾,它无法执行诸如下载文件之类的简单任务。我不知道可以根据需要合并文件的工具,但是您可能想看看GitHub.com。这是一个学习曲线,但是如果正确使用它会非常有效。