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

Sig*_*uza 5 c c++ clang

假设我有一个由C和C++代码组成的代码库,如下所示:

TC:

int derp(void)
{
    return 42;
}
Run Code Online (Sandbox Code Playgroud)

t.cpp:

#include <iostream>

extern "C" int derp(void);

int main(void)
{
    std::cout << derp() << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

使用clang(++),我可以一次编译它们,就像这样:

clang++ -o t -xc++ t.cpp -xc t.c
Run Code Online (Sandbox Code Playgroud)

但是,如果我现在想要使用非标准功能,gnu++14并调用编译器,如下所示:

clang++ -o t -xc++ -std=gnu++14 t.cpp -xc t.c
Run Code Online (Sandbox Code Playgroud)

我遇到了一个错误:

error: invalid argument '-std=gnu++14' not allowed with 'C/ObjC'
Run Code Online (Sandbox Code Playgroud)

不像-x,-std似乎不是基于文件级别工作,而是作为一个全局选项,因为-std=c11像这样添加:

clang++ -o t -xc++ -std=gnu++14 t.cpp -xc -std=c11 t.c
Run Code Online (Sandbox Code Playgroud)

简单地告诉我"反向"错误,可以这么说:

error: invalid argument '-std=c11' not allowed with 'C++/ObjC++'
Run Code Online (Sandbox Code Playgroud)

而且我知道我可以将每个源文件.o分别编译成一个文件并在之后将它们链接在一起(是的,无论如何我都在自动完成整个过程),但我不禁认为用每种语言编写不同的标准应该是可能的.毕竟,clang支持一起编译不同语言的文件,在这样做时,它们是否已经需要单独的标准值?

那么,有没有一种方法可以在编译C和C++代码时使用clang(++)手动指定标准?

Lig*_*ica 4

你可以编译C,也可以编译C++。

不能同时编译为 C 和 C++。

使用适合 C 的标志编译 C 源文件。

然后使用适合 C++ 的标志(例如 )编译 C++ 源文件-std=gnu14

然后将结果链接在一起以获得可执行文件。

clang   -o a.o t.c
clang++ -o b.o t.cpp -std=gnu++14
clang++ -o t   a.o b.o
Run Code Online (Sandbox Code Playgroud)

您无法使用尝试同时执行这两项操作的速记方式。它被设计为当所有标志和所有内容都相同时的快捷方式。-x尽管它具有让你接近的魔力。