【问题标题】:Is there a code preprocessing tool that would merge multiple user defined includes (an no system includes) into one file?是否有一种代码预处理工具可以将多个用户定义的包含(无系统包含)合并到一个文件中?
【发布时间】:2021-03-21 06:57:07
【问题描述】:

我有一个由多个 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;
}

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

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

【问题讨论】:

  • 如果您使用的是 linux 或类似系统,您可以使用 cat file1 file2 &gt; result 将多个文件合并为一个。这个操作的目的是什么?
  • 请为您为什么想要/需要合并文件的问题添加一些背景信息。
  • @Human-Compiler 抱歉,不需要
  • 您想自动提交大量组合项目到在线编码竞赛?一种可能的算法可能是创建作为项目一部分的所有头文件的列表,cat 所有头文件后跟所有源文件,并删除所有引用项目头文件之一的#include 行,例如使用@ 987654332@。当然,将所有代码组合到一个大的编译单元中编译可能会与单独编译模块产生不同的结果。您甚至可能会遇到正常编译不会发生的错误。

标签: c++ include preprocessor


【解决方案1】:

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

如果您可以使用命令行工具,您可以简单地使用sed。如果您将所有本地标头包含更改为#include "...",那么您可以这样做:

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

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

【讨论】:

  • 我会接受这个答案。好像没有工具可以做到,所以我只好自己写一个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-07
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
  • 1970-01-01
相关资源
最近更新 更多