假设我有一个包含C和C ++代码的代码库,如下所示:
t.c:
int derp(void)
{
return 42;
}
t.cpp:
#include <iostream>
extern "C" int derp(void);
int main(void)
{
std::cout << derp() << std::endl;
return 0;
}
使用clang(++),我都可以一次编译它们,就像这样:
clang++ -o t -xc++ t.cpp -xc t.c
但是,如果我现在想使用非标准功能,例如gnu++14
并像这样调用编译器:
clang++ -o t -xc++ -std=gnu++14 t.cpp -xc t.c
我遇到一个错误:
error: invalid argument '-std=gnu++14' not allowed with 'C/ObjC'
与-x
不同,-std
似乎不是基于文件级别的,而是全局选项,因为这样添加-std=c11
:
clang++ -o t -xc++ -std=gnu++14 t.cpp -xc -std=c11 t.c
简单地给我“反向”错误,可以这么说:
error: invalid argument '-std=c11' not allowed with 'C++/ObjC++'
我知道我可以将每个源文件分别编译为.o
文件,然后将它们链接在一起(是的,无论如何我要使整个过程自动化),但是我不禁想到每种语言应该有不同的标准。毕竟,clang支持将不同语言的文件一起编译,这样做时是否需要为标准提供单独的值?
那么,使用clang(++)可以同时编译C和C ++代码时手动指定标准吗?
答案 0 :(得分:3)
您可以编译C,也可以编译C ++。
您不能同时使用C和C ++进行编译。
使用C适当的标志编译C源文件。
然后使用适合C ++的标志(例如-std=gnu14
)编译C ++源文件。
然后将结果链接在一起以获得可执行文件。
clang -o a.o t.c
clang++ -o b.o t.cpp -std=gnu++14
clang++ -o t a.o b.o
您不能同时使用尝试使用的速记形式。当所有标志和所有标志都相同时,它被设计为快捷方式。尽管-x
的魔力使您更加接近。