我有一个包含多个源文件和头文件的 C++ 项目。我想要将我的项目提交到一个需要单个源文件的编程竞赛中。是否有自动化的方式将所有文件合并成单个 .cpp 文件?
例如,如果我有 a.cpp、a.h、b.cpp、b.h 等文件,我希望得到一个可以成功编译和运行的 main.cpp 文件。如果我手动合并这些文件,我是否只需将头文件合并并将源文件追加到彼此后面即可?在 externs、include 依赖和前向声明方面是否有需要注意的地方?
我有一个包含多个源文件和头文件的 C++ 项目。我想要将我的项目提交到一个需要单个源文件的编程竞赛中。是否有自动化的方式将所有文件合并成单个 .cpp 文件?
例如,如果我有 a.cpp、a.h、b.cpp、b.h 等文件,我希望得到一个可以成功编译和运行的 main.cpp 文件。如果我手动合并这些文件,我是否只需将头文件合并并将源文件追加到彼此后面即可?在 externs、include 依赖和前向声明方面是否有需要注意的地方?
#include
位置,但通常情况下,您不能简单地连接源文件。首先,您可能会在具有文件作用域的事物之间遇到命名冲突。而且,考虑到您将每个头文件(包括类定义等)复制粘贴到每个源文件中,您最终会得到多次定义的类。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
及其缺点的文档这里。在Tigress
中提供了适用于Mac OS X
和Linux
的二进制分发。
嗯,这是可能的,我见过很多项目将源文件合并为单个.h和.c/.cpp文件,比如sqlite。
但是代码必须有一些限制,例如您不应该在其中一个源代码中具有静态全局变量。
可能没有通用的工具来合并源代码。您应该根据自己的代码编写一个。
以下是一些示例:
我刚找到了一个非常适合我的 npm 包,它正好符合我的需求:cpp-merge
我提供链接: https://www.npmjs.com/package/cpp-merge
安装方法:
npm install -g cpp-merge
使用方法:
cpp-merge file.cpp
这将创建一个包含在 file.cpp 的所有指定文件#include "library.cpp"
的合并文件。
此外,值得一提的是,它默认输出到标准输出。如果要将其写入文件,可以执行以下操作:
cpp-merge --output output.cpp
欲了解更多详细信息,请查看文档!
我认为带有头文件和源文件的项目比只有一个主文件的项目更好。不仅更容易处理和阅读,而且它们表明您在分离程序模块方面做得很好。
由于你的解决方案,我提供了这个格式,我认为你需要手工完成:
// STL headers
// --- prototype
// monster.h
// prince.h
// --- implementation
int main() {
// your main function
return 0;
}
我不知道有没有一个工具可以将.cpp文件合并在一起,但是我会把所有的文件压缩成一个gzip文件然后发送。
如果您选择发送单个文件而不是压缩存档(例如tarball或zip文件),则可能需要考虑一些事情。
首先,像Thomas Matthews已经提到的那样将文件串联在一起。通过一些修改,您通常可以编译一个文件。删除不存在的#include
语句,例如现在已包含的头文件。
您还必须按照它们各自的依赖关系顺序将这些文件连接在一起。也就是说,如果a.cpp需要在b.hpp中声明的类,则您很可能需要按照Thomas Matthews列出的顺序串联。
话虽如此,我认为共享代码的最佳方式是通过公共存储库,例如GitHub.com或compressed archive。
#include "a.cpp" #include "b.cpp" ...
然后使用 /E 选项编译这个单独的 .cpp 文件。结果(stdout)是一个包含整个项目的单个 .cpp 文件。虽然不太方便且输出结果并不美观,但却有效。 - mdew