如何判断 g++ 和 clang 可用的 C++ 版本

问题描述 投票:0回答:4

很简单。 我可以通过传递 --std 选项来选择 g++ 或 clang 的版本。 我怎样才能让 g++ 或 clang 显示哪些版本可用?

c++ g++
4个回答
7
投票

对于叮当声:

$ touch 1.c 1.cpp;clang -std=x 1.c 1.cpp
error: invalid value 'x' in '-std=x'
note: use 'c89', 'c90', or 'iso9899:1990' for 'ISO C 1990' standard
note: use 'iso9899:199409' for 'ISO C 1990 with amendment 1' standard
note: use 'gnu89' or 'gnu90' for 'ISO C 1990 with GNU extensions' standard
note: use 'c99' or 'iso9899:1999' for 'ISO C 1999' standard
note: use 'gnu99' for 'ISO C 1999 with GNU extensions' standard
note: use 'c11' or 'iso9899:2011' for 'ISO C 2011' standard
note: use 'gnu11' for 'ISO C 2011 with GNU extensions' standard
note: use 'c17', 'iso9899:2017', 'c18', or 'iso9899:2018' for 'ISO C 2017' standard
note: use 'gnu17' or 'gnu18' for 'ISO C 2017 with GNU extensions' standard
note: use 'c2x' for 'Working Draft for ISO C2x' standard
note: use 'gnu2x' for 'Working Draft for ISO C2x with GNU extensions' standard
error: invalid value 'x' in '-std=x'
note: use 'c++98' or 'c++03' for 'ISO C++ 1998 with amendments' standard
note: use 'gnu++98' or 'gnu++03' for 'ISO C++ 1998 with amendments and GNU extensions' standard
note: use 'c++11' for 'ISO C++ 2011 with amendments' standard
note: use 'gnu++11' for 'ISO C++ 2011 with amendments and GNU extensions' standard
note: use 'c++14' for 'ISO C++ 2014 with amendments' standard
note: use 'gnu++14' for 'ISO C++ 2014 with amendments and GNU extensions' standard
note: use 'c++17' for 'ISO C++ 2017 with amendments' standard
note: use 'gnu++17' for 'ISO C++ 2017 with amendments and GNU extensions' standard
note: use 'c++20' for 'ISO C++ 2020 DIS' standard
note: use 'gnu++20' for 'ISO C++ 2020 DIS with GNU extensions' standard

对于 gcc,它存在于 gcc -v --help中。


2
投票

愚蠢的方法,但有效:

strings "$(which gcc)" | grep -o -- '-std=[^] ),.]\+' | sort -u

或使用手册页:

man gcc | grep -o -- '-std=[^] ),.]\+' | sort -u

遗憾的是

clang
不适用于此,因为似乎解析是在共享库中完成的。我最终得到:

 which clang | xargs ldd | grep libclang-cpp | awk '{print $3}' | xargs strings | grep -o -- '-std=[^] ),.`'\'']\+' | sort -u

但这并不是全部选择。

man
对于 clang 效果更好,但需要更多解析:

 man clang | sed -n '/^ *-std=/,/^ *-/{ s/^                 \([^ ]\)/-std=\1/p; }'

1
投票

在安装了

binutils
的Linux上,您可以提取相关的
strings
,例如

strings /usr/bin/g++ | grep -e -std=

在我的电脑上给出

  -std=<standard>          Assume that the input sources are for <standard>.
--std=
-fobjc-std=objc1
-std=c++03
-std=c++0x
-std=c++11
-std=c++14
-std=c++17
-std=c++1y
-std=c++1z
-std=c++2a
-std=c++98
-std=c11
-std=c17
-std=c18
-std=c1x
-std=c2x
-std=c89
-std=c90
-std=c99
-std=c9x
...

还有更多。


-2
投票

某些版本的 GCC 接受

--help
选项,
-dumpversion
选项
--target-help

因此请尝试先在计算机上运行

g++ --help
g++ -dumpversion
g++ --target-help
命令,然后尝试
g++ -v --help
。在我的 Debian 桌面上,我从他们那里获得了有用的信息。

某些版本的 Clang 接受

--help
选项和
--version
选项。

GCC 和 Clang 都是开源,并且他们的网站提供最新版本。

也许您应该考虑在您的软件项目中使用 GNU autoconf

另一种方法是下载最新的 GCC 或 Clang 编译器的源代码并在计算机上编译它们。如果在 Linux 上,请阅读 从头开始 Linux

似乎最近的 C++ 标准(参见 n3337 或更好)定义了像

__cplusplus
这样的预处理器符号。请参阅 Linux 的 feature_test_macros(7)standards(7)

如何让 g++ 或 clang 显示可用版本?

我猜你无法可靠且自动地做到这一点(例如,在某个阁楼中发现一台十年前的笔记本电脑)。想想

$PATH
的技巧。但我会尝试先运行
g++ --version
clang --version
,然后再查看一些网站。

最后,即使在最近的 GCC 中,C++ 的一些晦涩功能也没有得到很好的支持。您可以在

[email protected]
邮件列表询问。

但是,GCC 是自由软件。您可以下载其源代码、为其做出贡献并改进它。

请注意,GCC 的发布(在GPLv3下)没有保修,并且存在bug....您无法确定它是否按照您认为应该的方式编译您的 C++ 代码。

您是否考虑过在 C++ 代码中添加类似的内容

#if __cplusplus < 201412L
#error expecting C++17 standard
#endif
© www.soinside.com 2019 - 2024. All rights reserved.