【发布时间】:2020-04-06 00:09:24
【问题描述】:
在编码竞赛中,我必须将我的所有 C++ 代码复制/粘贴到一个 html 输入表单中,这些代码是远程编译的。随着代码越来越大,我想将代码分成几个文件。
所以,我有几个 C++ 源文件,一个是 main.cc 和其他一些标题,例如 f.h。
我希望将这些源文件连接到单个源文件allinone.cc 中,以便我可以使用clang++ allinone.cc 进行编译。
我想这可以使用 clang 预处理器来实现。
一个最小的例子是:
-
main.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 <iostream> 消失了,namespace 规范被重复了。
有没有办法调用 clang 预处理器来实现以直接方式描述的串联?
【问题讨论】:
-
天堂将我们从糟糕课程的限制中解救出来......
-
@user1551605 我建议在问题中描述动机。我还有一个问题:为什么使用g++编译时使用clang预处理器?
-
你在做什么比赛?作为一名有竞争力的程序员,我发现没有理由将代码拆分为多个文件。如果比赛只允许提交单个文件,那么在单个文件中编写代码是最简单的。
-
@eerorika 我已编辑问题以遵循您的建议。我在文本中使用 g++ 作为 C++ 编译器的通用调用,它在我的设置中链接到 clang++。还对其进行了编辑,因为它可能会造成混淆。
-
如果您的项目是单个源文件,那么使用文本编辑器很容易。找到所有
#include("filename"形式),将每一个替换为标题的内容。如果这会带来更多#includes,请重复,但不要再次复制任何标题。删除像#pragma once这样的非标准结构(因编译器而异)(如果您手动复制了头文件的内容,这些结构的效果是不可预测的)。如果您的代码将由人工检查,请删除任何#include警卫(并将其用作您没有多次复制任何标头的完整性检查)。
标签: c++ clang preprocessor