编译C和C++代码时指定-std的含义是什么?

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

8
通常处理这类事情的方法是准备一个Makefile,它单独编译每个翻译单元,使用适用于C和C++翻译单元的选项,并让make并行运行它们,这当然会更快。我相信你明白大型软件库手动编译的不可能性。这就是Makefile的用途:正确地编译一堆文件。 - Sam Varshavchik
@SamVarshavchik 这应该真的是一个答案。 - bolov
1
@SamVarshavchik 一起完成它们的一个潜在用例是,我认为这样做可能会有更多的优化(虽然我可能错了,但我不认为所有东西都可以通过链接时优化来实现)。而且,我认为与其他选项(如cmake)相比,autotools正在失去支持,因此对于第一次研究此类工具的人来说,从那里开始可能会更好。 - Daniel H
1
话虽如此,有一些工具可以帮助创建Makefile。例如,在CMake中,你只需要做类似这样的事情:cmake_minimum_required(VERSION 3.11) project(t) set(CMAKE_CXX_STANDARD 14) set(CMAKE_C_STANDARD 11) add_executable(t t.cpp t.c) - Daniel Schepler
2021年 -- LLVM 12 -- 据我所知,如果您执行clang t.c t.cpp,结果将是可执行文件命名为t。默认的C标准是gnu17,默认的C++标准是gnu++14。 如果您需要例如c++17,则需要分别编译它们,然后链接它们。就像@Lightness Races in Orbit下面的回答中建议的那样。 - Chef Gladiator
显示剩余2条评论
1个回答

4

您可以编译 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的神奇作用差不多可以帮你接近。


1
“你不能同时将代码编译为 C 和 C++。”你显然可以,否则 -x 选项会有不同的效果。您能进一步澄清您的意思吗? - Daniel H
1
@DanielH:你可以将源文件编译为C。你可以将源文件编译为C ++。你不能同时将源文件编译为C和C ++。当然,这并不是整个故事,正如我自己指出的那样,因为有一种使用“-x”的速记方式可以让您接近OP想要做的事情。但是,这不是将两个完全不同的编译命令合并为一个的方法。所以,“显然你可以”不行,我提供了解决方案。 - Lightness Races in Orbit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接