当前位置:C++技术网 > 资讯 > C++程序for循环中使用auto关键词总是编译不过

C++程序for循环中使用auto关键词总是编译不过

更新时间:2016-08-29 10:09:17浏览次数:1+次

原程序代码

#include <iostream>

#include <string>

using namespace std;

int main()

{

const string s="some string";

for(auto &c : s)

{

c=''''X'''';

}

return 0;

}

用g++编辑显示如下信息

test.c: 7:17: error: range-based ''''for'''' loops are not allowed in C++98 mode


C++技术网解答:

    对待错误首先第一件事要做的是,看错误信息,包括看懂错误提示的语句的意思,至于错误代表的技术上含义则是第二步的事情。

    这里的错误提示为:error: range-based ''''for'''' loops are not allowed in C++98 mode

    翻译一下:错误:基于范围(range-based)的for循环(loops)在C++98模式是不允许的。这个翻译你必须自己做好,不要期望他人帮你翻译,因为太多太多的错误信息都是英文,你必须自己熟悉这些基本的提示。这无关英语水平好坏,有关于是否用心去做这件事情,查单词看意思。

    错误分析:

    你使用的语法是C++新标准语法,而不是C++98标准的语法。我们通常用的旧标准就是C++98标准。g++默认的应该是C++98标准语法。所以,在C++98标准语法下,新语法语句是无效的,也就是错误的。所以,你的语句:


for(auto &c : s) 
     是按照新标准语法写的,使用的g++语法标准却是C++98,所以造成了语法错误。解决的办法就是,要么代码使用传统的C++98语法写,要么就设置g++编译器的语法标准为C++11或者C++13等。主要看你用的新语法特性是哪一个语法标准的。太新的标准可能编译器不是支持的太好,所以要查看相关编译器说明文档。


    编译器在编译的时候,只会针对当前设置的语法标准来检查语法,而不会去分析你的语句是哪个语法标准,所以错误提示只能看到是这个语句的错误,所以没有准确的错误提示。而这个错误提示要看懂的突破点就在于提示有C++98模式和你代码的特别之处。虽然编译器没有明确提示语法标准错误,但是给了C++98模式也可以差不多推断出来。

    解决做好的办法就是设置一下g++默认支持的语法标准,下面是设置的方法:

1.使用预编译指令设置

#pragma GCC diagnostic error "-std=c++11"  
#include <iostream>  
using namespace std;  
int main(int argc,char **argv)  
{  
    cout<<"hello world!"<<endl;  
    auto i=10;  
    cout<<i<<endl;  
    return 0;  
}
2.给g++命令重命名为新标准C++11编译器版本,命令行如下:

alias g++=''''g++ -std=c++11''''  
g++ test.c -o hw
     如果你的新语法是C++11更高版本,这里只需要修改代码中看到的C++11,改为对应的版本即可。