在编码竞赛中,我必须将所有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预处理程序以实现直接描述的串联?
clang -nostdinc
做另一件事,不是您期望的。该键禁用包含搜索路径中的标准包含目录。因此,由于预处理器无法包含文件-nostdinc
,在已知的包含搜索路径中找不到该文件,因此会出现错误。
您想要的是不可能实现的。您应该使用文件cat
并手动清除结果,或者使用可以删除#include
的特殊软件。我建议您只使用grep
,sort
,uniq
的组合,然后将其删除并过滤掉#include
到串联文件的顶部。