禁用std :: map :: at()

时间:2013-11-08 18:43:16

标签: c++ gcc c++11 map

我正在用gcc4.7编译一些代码,这是为c ++ 11编写的,但我希望它能与gcc4.4兼容。奇怪的是,即使在我删除std::map::at()标志之后,使用-std=c++11(仅应该在c ++ 11中定义)的代码似乎也没有给我编译错误。我想得到编译器错误,因为这段代码必须与可能不使用gcc4.7的同事共享。这是正常的吗?有没有办法限制std::map的行为?

1 个答案:

答案 0 :(得分:4)

显然,使用新的 gcc 和新库无法实现这一目标,至少不用自己编译它们。

作为一个实用的解决方案,假设您拥有一台相对现代的PC(6 + GB的内存,可能只有4GB),我建议您

  1. 在虚拟机中安装较旧的Linux发行版,该虚拟机具有所需的旧 gcc 和匹配的旧标准库。这比尝试在主开发操作系统中设置备用编译器和库环境要麻烦得多。

  2. 如果您尚未安装源代码,请将其保留在版本控制中。

  3. 在旧虚拟机中设置脚本以手动检出并构建软件,或者加倍努力,在虚拟机上设置Jenkins并创建一个工作来轮询您的版本控制仓库并在您对主开发环境进行提交时自动执行测试构建。

  4. 关于这一点的好处是,您可以轻松设置任意数量的不同环境和操作系统,并保持主要开发操作系统与最新版本保持同步。


    对于理想的世界,

    原始答案

    要获得严格的C ++ 03,请使用以下标志:

    -std=c++03 -pedantic
    

    另外,如果您只想支持 gcc ,您可能需要-std=g++03“标准”,但除非有一些特定的功能,比如C99风格的VLA,你真的想要使用,那么我建议不要这样做。你永远不知道你或其他人将来可能想要使用哪种编译器。

    作为附注,也建议(至少如果你想修复警告):-Wall -Wextra


    悲伤的现实看起来像选择C ++标准确实无法解决问题。据我所知,这在 gcc 编译器中确实不是问题,它是GNU C ++标准库中的一个问题,显然没有检查所需的C ++标准版本(带{{ 1}}在头文件中)。如果它困扰你,你可以考虑提交a bug report(如果已经没有,但我找不到a quick search)。