是否有一种代码预处理工具可以将多个用户定义的包含(无系统包含)合并到一个文件中?

Is there a code preprocessing tool that would merge multiple user defined includes (an no system includes) into one file?

我有一个由多个 c++ 文件组成的项目。我需要将所有这些文件合并为一个 main.cpp 文件并通过网络发送一个文件。另一端的收件人将编译并 运行 文件:

gcc main.cpp
./a.out

请注意,另一端的接收者是一个程序,只需要一个文件,不会更改他的编译指令。

例如:假设我有以下 2 个文件:

main.cpp:

#include <iostream>
#include <vector>    

#include <my_utils.hpp>

int main() {
    std::vector<int> v = GetVector();
    court << v.size() << endl;
    return 0;
}

my_utils.hpp:

#pragma once

#include <vector>
std::vector<int> GetVector() {...}
void ProcessVector(const vector<int>& v) {...}

问题: 是否有预处理器命令将这两个文件合并为一个文件以获得以下内容:

// merged.cpp
// the recipient can compile and run this file

#include <iostream>
#include <vector>

std::vector<int> GetVector() {...}
void ProcessVector(const vector<int>& v) {...}

int main() {
    std::vector<int> v = GetVector();
    cout << v.size() << endl;
    return 0;
}

标准预处理器合并所有内容,包括 <vector> 包含的大量代码。我想要的是将多个文件合并为一个文件,其中只包含我自己定义的函数。

可选:如果我没有在主程序中使用 ProcessVector,预处理器是否可以从最终合并文件中排除该函数?

我不知道有任何预处理器技术可以做到这一点,但还有其他可能性。我读到你只是想发送一个 compile-able main.cpp 文件用于在线编码竞赛,所以这就是我正在处理的。

如果您可以使用 command-line 工具,则只需使用 sed。如果您将所有本地 header 包含更改为 #include "...",那么您可以:

sed '/#include ".*"/d' *.hpp *.cpp

它的作用是打印除具有 #include "..."stdout 的行之外的所有行。所有 .hpp 文件都将在所有 .cpp 文件之前,因此原型应该不会有任何复杂性。然后您可以将此输出重定向到某个文件。