1

我是 C++ 新手。当我写

for (char* c : v)
{
    cout << c;
}

我明白了

“C++98 模式下不允许基于范围的‘for’循环”

据我了解,我必须更改我的 GCC 版本(或只是模式?)。我的g++ -v

使用内置规范。COLLECT_GCC=g++ COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-linux-gnu/4.7/lto-wrapper 目标:i686-linux-gnu 配置:../src/configure -v --with-pkgversion='Ubuntu/ Linaro 4.7.2-2ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-4.7/README.Bugs --enable-languages=c,c++,go,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.7 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.

无法从 vim(使用 c.vim 插件)、sublime text3 以及使用gcc program.cppand的终端编译gcc -pedantic -std=c99 program.cpp

我已经下载了 gcc 4.8.1 但它不是 deb 包所以无法正确安装。还听说过 C++11、C++14、C++98、C++99。我在哪里/如何获取/安装最新版本?

vim插件c.vim的解决方案:

编辑“c.vim/plugin/c.vim”。更改此行

let s:C_CplusCFlags = '-Wall -g -O0 -c -std=c++11' " C++ compiler flags: compile, don't optimize

我添加了“-std=c++11”并且它有效。

4

2 回答 2

5

基于范围的 for 循环是 C++11 的一部分,因此您需要使用-std=c++11G++ 来启用 C++11 功能。

于 2013-09-21T23:38:03.800 回答
3

如上一个答案中所述,您在为旧标准编译时尝试使用最新 C++ 标准(称为 C++11)的功能。C++11 是最新的 C++ 标准,也是唯一一个基于它的支持范围。

现在您需要区分 C++ 标准和该标准的编译器支持。在过去的几年里,对 C++11 特性的支持逐渐被添加到 gcc 编译器中。以下链接显示了哪个 gcc 版本支持哪个 C++11 功能:

GCC 中的 C++0x/C++11 支持

如您所见,基于范围的 for 已在 gcc 4.6 中添加,因此您不需要 gcc 4.8 即可使用此功能 - gcc 4.6 或更高版本就足够了。

编译时,您还需要告诉编译器要根据哪个标准进行编译。-std=whatever 告诉编译器使用哪个标准。

您当前正在使用“-std=c99”,告诉编译器使用旧的 C++ 标准进行编译。相反,您需要将此标志设置为 c++11。如果这在您使用的 gcc 版本上不起作用,请尝试改用“-std=c++0x”(C++0x 是 C++11 标准的旧名称。)

于 2013-09-22T15:53:00.180 回答