问题
c++20标准已经发布,c++20有比较多的新特性。想尝个先,虽然目前还没有一个编译器能够完全支持c++20标准。gcc和clang编译支持c++20多一些,gcc支持最好。
安装Ubuntu系统20.0.4,自带的gcc都还不支持c++20。需要使用最新的gcc10.2.0版本,需要编译。于是自己动手。
编译gcc
-
1.下载最新的gcc10.2.0
访问:https://gcc.gnu.org/mirrors.html,找个镜像金星下载gcc。 -
2.解压缩
我下载的是xz文件,需要先试用xz解压成tar包,然后再使用tar进行解压:
xz -d gcc-10.2.0.tar.xz
tar xvf gcc-10.2.0.tar
- 3.下载依赖包
gcc会依赖gmp.mpfr和mpc几个包,如果有网络,可以直接自带的脚本自动下载,然后编译。
cd gcc-10.2.0
./contrib/download_prerequisites
- 4.编译
cd ..
mkdir gcc-build-10.2.0
cd gcc-build-10.2.0
../gcc-10.2.0/configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
我只用到c和c++,所以只编译这两种语言的编译器。下面是make
make -j4
开4个线程同时编译,接下来是漫长的等待。我使用笔记本上虚拟的4U4G的vm进行编译,将近40分钟,cpu温度90左右。不得不承认,gcc现在确实太庞大了。
- 5.安装
sudo make install
- 6.检查版本
g++ --version
g++ (GCC) 10.2.0
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
测试c++20特性
简单写了一个concept的代码,保存成main.cpp,代码如下:
#include <iostream>
template<typename T>struct is_integer;
template<>
struct is_integer<int>{
typedef int type;
};
template<typename T>
concept IsInteger = requires(T){
typename is_integer<T>::type;
};
template<IsInteger T>
T add(T a, T b){
return a+b;
}
int main(int argc, const char * argv[]) {
using namespace std;
cout << add(1,2) << endl;
cout << add(1.0, 2.0)<< endl;
return 0;
}
编译输出:
g++ main.cpp -std=c++2a -o a.out
main.cpp: In function ‘int main(int, const char**)’:
main.cpp:23:25: error: use of function ‘T add(T, T) [with T = double]’ with unsatisfied constraints
23 | cout << add(1.0, 2.0)<< endl;
| ^
main.cpp:16:3: note: declared here
16 | T add(T a, T b){
| ^~~
main.cpp:16:3: note: constraints not satisfied
main.cpp: In instantiation of ‘T add(T, T) [with T = double]’:
main.cpp:23:25: required from here
main.cpp:11:9: required for the satisfaction of ‘IsInteger<T>’ [with T = double]
main.cpp:11:21: in requirements with ‘T <anonymous>’ [with T = double]
main.cpp:12:15: note: the required type ‘typename is_integer<T>::type’ is invalid
12 | typename is_integer<T>::type;
| ~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~
cc1plus: note: set ‘-fconcepts-diagnostics-depth=’ to at least 2 for more detail
从结果可以参数,代码cout << add(1.0, 2.0)<< endl;
如逾期的那样不符合concept的要求,编译不通过。
讨论
由于用的是vm,编译出来的gcc,我直接覆盖了系统自带的gcc版本。即使有问题,重新做一个vm就行了,所以没有弄新老gcc并存。
如果你用的是Ubuntu系统,可以直接使用apt-get进行安装gcc,不过可能不是最新的版本,只是最近一次稳定的版本。
sudo apt-get install gcc-10
sudo apt-get install g++10
g++-10 --version
g++-10 (Ubuntu 10.2.0-5ubuntu1~20.04) 10.2.0
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
c++20标准目前比较新,没有编译器完全支持。微软的vs又太庞大了,弄个gcc来学习还是蛮简单的。gcc的编译,还是比简单,gcc4.0版本时就自己动手编译过,没想到过了五六年,之前的编译方法依然可以使用。
网友评论