#include<iostream>
#include<string>
using namespace std;
int main(){
string s("hello, world!!!");
decltype(s.size()) punct_cnt=0;
for(auto c : s){
if (ispunct(c))
{
++punct_cnt;
}
}
cout<<punct_cnt<<endl;
return 0;
}
今天在编译这段代码时遇到了这样的报错,让我百思不得其解,代码绝对是没得问题,检查了5遍不止,没办法只能上网搜,搜也没搜到个结果,最好感觉会不会是版本不支持的原因呢,就使用devtool对gcc/g++进行升级,升级到了版本8,然后一编译,顺利通过,没有任何报错,所以大概率就是版本的问题,在上面这段代码里面用到了一个C++11新版本提供的范围for语句。
所以在这里我就围绕这个问题进行一些总结记录:
先说一下升级使用到的devtool工具,这是一个centos软件集合存储库,存在的目的是为了弥补yum安装不了更高级版本的问题,就比如g++,在yum上的版本是4.8.5,但是有些代码需要更高级的版本,就需要此软件集
在安装时只需要使用yum进行安装
sudo yun -y install centos-release-scl
安装完成后如果需要列出所有的版本就可以使用下面这个命令:
yum list all --enablerepo='centos-sclo-rh'|grep gcc
这时找到自己想要更新的版本,比如我更新g++
因为我已经安装好了,就显示nothing to do
等安装好之后,就需要设置启用这个下载的版本
目前我知道的有两个方式,其中的原理都差不多:
一种是将source命令写入到.bash_profile里面,以后每一次重启都会执行一遍,应该算是永久生效,一种是临时生效,先说永久生效:
echo ‘source /opt/rh/devtoolset-8/enable’ >> ~/.bash_profile
source /opt/rh/devtoolset-8/enable
把一条source命令写进~/.bash_profile里面,每一次切换到当前用户都会生效,也就是都换自动的启用8这个版本,第二条就是执行切换到版本8环境的命令。
下面说临时生效:
scl enable devtoolset-8 bash
这条命令应该是给bash切换一个环境,以后使用g++和gcc就会是版本8,说到这就不得不提一下bash是个什么东西了,Bash 就是一种跑电脑里的程序(program),但它的设计使你能轻松地与之“对话”(talk)。在电脑里面每个程序有每个程序所作的事,就比如时间了、读取文档了、启动其他程序、线程管理等。bash这个程序与它们最大的不同在于它并不执行任何特定的任务,而是听取用户的命令,所以我们为了与其对话也特地创造出来一种叫做bash shell的语言,什么是shell呢?shell这类程序本质上就是提供一个与其他程序交互的界面。bash是一种shell程序,它就是被设计出来听从我们的命令,做我们让它做的事。最后提一嘴bash这个的读法是 ba-shell。而且就把这条命令如果也echo进bash.profile应该也可以永久生效,不过我没试过。
下面说几个文件吧:
在Linux中比较常见的几个文件是profile、bashrc和bash_profile
profile
路径:/etc/profile
作用:用于设置系统级的环境变量和启动程序,在这个文件下配置会对所有用户生效。
方式:当用户登录(login)时,文件会被执行,并从/etc/profile.d目录的配置文件中查找shell设置。
在profile中设置环境变量
一般是不建议在/etc/profile文件中添加环境变量的,因为在这个文件中添加的设置会对所有用户起作用,对于一些特殊的设置反而会引发一些不必要的麻烦。
bashrc
bashrc 文件主要用于配置函数或别名,一些个性化的配置也在bashrc里面可以设置,我之前有篇文章写到设置bash界面颜色和格式就是在此文件里设置的。bashrc 文件只会对指定的 shell 类型起作用,bashrc 只会被 bash shell 调用。bashrc 文件有两种级别:系统级和用户级
系统级:系统级位于/etc/bashrc,对所有用户生效
用户级:用户级位于~/.bashrc,仅对当前用户生效
bash_profile
bash_profile只对单一用户有效
文件位于:~/.bash_profile,该文件是一个用户级的设置,就是某一个用户的 profile 目录下。
这个文件也可以用于配置环境变量和启动程序,但只针对单个用户有效。和profile 文件类似,bash_profile 也会在用户登录(login)时生效,也可以用于设置环境变量,与 profile 不同的是bash_profile 只会对当前用户生效。
/etc/profile,/etc/bashrc 是系统全局环境变量设定;
~/.profile, ~/.bashrc 是用户家目录下的私有环境变量设定。
1.首先在/etc/profile中读入全局环境变量设定,然后根据其内容读取额外设定的文档,/etc/profile.d和/etc/inputrc;
2.再根据不同用户,在其家目录内读取~/.bash_profile;
3.如果上一步读取失败则会读取~/.bash_login;
4.若再次失败则读取~/.profile(这三个读取的文档设定上基本无差别,但是仅读取上有优先级)
5.最后根据用户帐号读取~/.bashrc。
~ /.profile 与 ~ /.bashrc都有个性定制的功能,但~ /.profile可以设定本用户专有的路径、环境变量等,它只能登入的时候执行一次,但是~ /.bashrc可以选择系统级还是用户级。