同时编译C和C ++代码时指定-std

时间:2018-07-07 00:03:44

标签: c++ c clang

假设我有一个包含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 ++代码时手动指定标准吗?

1 个答案:

答案 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的魔力使您更加接近。