【问题标题】:Use clang preprocessor to concatenate C++ source files into one [duplicate]使用clang预处理器将C++源文件连接成一个[重复]
【发布时间】:2020-04-06 00:09:24
【问题描述】:

在编码竞赛中,我必须将我的所有 C++ 代码复制/粘贴到一个 html 输入表单中,这些代码是远程编译的。随着代码越来越大,我想将代码分成几个文件。

所以,我有几个 C++ 源文件,一个是 main.cc 和其他一些标题,例如 f.h。 我希望将这些源文件连接到单个源文件allinone.cc 中,以便我可以使用clang++ allinone.cc 进行编译。 我想这可以使用 clang 预处理器来实现。

一个最小的例子是:

  • ma​​in.cc

    #include <iostream>
    using namespace std;
    
    #include "f.h"
    
    int main() { 
       f();
    }
    
  • f.h

    #pragma once
    #include <iostream>
    using namespacestd;
    
    void f() { 
      cout <<
    }
    

我能得到的最接近的是:

clang -E -nostdinc main.cc | grep -v "^#" > allinone.cc 

产生:

#include <iostream>
         ^~~~~~~~~~
1 error generated.

using namespace std;
using namespacestd;

void f() {
  cout <<
}

int main() {
   f();
}

-nostdinc 选项成功避免包含来自标准包含的代码。但是,原来的#include &lt;iostream&gt; 消失了,namespace 规范被重复了。

有没有办法调用 clang 预处理器来实现以直接方式描述的串联?

【问题讨论】:

  • 天堂将我们从糟糕课程的限制中解救出来......
  • @user1551605 我建议在问题中描述动机。我还有一个问题:为什么使用g++编译时使用clang预处理器?
  • 你在做什么比赛?作为一名有竞争力的程序员,我发现没有理由将代码拆分为多个文件。如果比赛只允许提交单个文件,那么在单个文件中编写代码是最简单的。
  • @eerorika 我已编辑问题以遵循您的建议。我在文本中使用 g++ 作为 C++ 编译器的通用调用,它在我的设置中链接到 clang++。还对其进行了编辑,因为它可能会造成混淆。
  • 如果您的项目是单个源文件,那么使用文本编辑器很容易。找到所有#include("filename" 形式),将每一个替换为标题的内容。如果这会带来更多#includes,请重复,但不要再次复制任何标题。删除像#pragma once 这样的非标准结构(因编译器而异)(如果您手动复制了头文件的内容,这些结构的效果是不可预测的)。如果您的代码将由人工检查,请删除任何 #include 警卫(并将其用作您没有多次复制任何标头的完整性检查)。

标签: c++ clang preprocessor


【解决方案1】:

clang -nostdinc做了另一件事,不是你所期望的。此键禁用包含搜索路径中的标准包含目录。因此,您会收到错误,因为预处理器无法包含文件 -nostdinc,无法在已知的包含搜索路径中找到它。

你想要的不可能实现。您应该使用cat 您的文件并手动清理结果或使用可以删除#include 的特殊软件。我建议您只使用grep、sort、uniq 的组合,并将删除和过滤的#include 放在连接文件的顶部。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 2022-01-22
    • 2012-03-28
    • 1970-01-01
    相关资源
    最近更新 更多