很简单。 我可以通过传递 --std 选项来选择 g++ 或 clang 的版本。 我怎样才能让 g++ 或 clang 显示哪些版本可用?
对于叮当声:
$ 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中。
愚蠢的方法,但有效:
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; }'
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
...
还有更多。
某些版本的 GCC 接受
--help
选项,-dumpversion
选项 --target-help
因此请尝试先在计算机上运行
g++ --help
和 g++ -dumpversion
和 g++ --target-help
命令,然后尝试 g++ -v --help
。在我的 Debian 桌面上,我从他们那里获得了有用的信息。
某些版本的 Clang 接受
--help
选项和 --version
选项。
GCC 和 Clang 都是开源,并且他们的网站提供最新版本。
另一种方法是下载最新的 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