【问题标题】:Can't compile C++ file.cpp. C++98 mode无法编译 C++ file.cpp。 C++98模式
【发布时间】:2013-09-27 03:21:03
【问题描述】:

我是 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。错误 --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.7 --libdir=/ usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable -plugin --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=i686- linux-gnu --host=i686-linux-gnu --target=i686-linux-gnu 线程模型:posix gcc 版本 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1) `

无法从 vim(使用 c.vim 插件)、sublime text3 和使用 gcc program.cppgcc -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”,它可以工作。

【问题讨论】:

  • 你是否尝试在 vim 中编译代码?
  • 注意区分C++和C。C99是C的标准;没有 C++99。
  • 您应该使用命令g++ -std=c++11gcc 用于 c 文件,g++ 用于 c++ 文件。
  • 另外,v 是什么类型。如果 v 是某个标准容器(如 std::vector),您可能想要 for (char c : v ) cout &lt;&lt; c;

标签: c++ ubuntu gcc vim c++98


【解决方案1】:

range based for loop is part of C++11,因此您需要将-std=c++11 与 G++ 一起使用以启用 C++11 功能。

【讨论】:

  • C++ 有很多版本:编译器通常实现一个,但支持将更高版本的部分实现作为扩展。一些供应商甚至从未完全实施标准......
【解决方案2】:

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

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

C++0x/C++11 Support in GCC

如您所见,基于范围的 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 标准的旧名称。)

【讨论】:

  • 我可以将其设为默认值吗?我从vim启动编译器,否则我必须在vim启动g ++的插件中找到。此外,当我尝试 -std=c++0x 时,它生成了“a.out”文件,与编译文件的名称不同。为什么? C+98 创建同名文件。
  • a.out 是 gcc 编译程序的默认文件名。您可以使用 -o 开关轻松告诉 GCC 生成不同的文件名。只需在编译命令中添加“-o yourname”即可。我自己不使用 vim,但您可能需要更改其配置文件。尝试谷歌它。
猜你喜欢
  • 2016-03-14
  • 2019-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多