首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >禁用std::map::at()

禁用std::map::at()
EN

Stack Overflow用户
提问于 2013-11-08 18:43:16
回答 1查看 136关注 0票数 1

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-08 19:09:11

显然,用一个新的gcc和新的图书馆是不可能做到这一点的,至少不自己编写它们。

作为一种实用的解决方案,假设您有一台相对现代的PC (内存的6+GB,也许4GB就可以了),我建议您

  1. 在虚拟机中安装一个较旧的Linux发行版,该虚拟机既有理想的老gcc版本,也有匹配的旧标准库。这比尝试在您的主要开发操作系统中设置另一个编译器和库环境要麻烦得多。
  2. 如果您已经没有版本控制,那么将源代码保存在版本控制中。
  3. 要么在旧的VM中设置一个脚本来手动签出和构建软件,要么多走一步,在VM上设置一个詹金斯,并创建一个作业来轮询您的版本控制回购,并在您提交主开发环境时自动进行测试构建。

这方面的好处是,您可以轻松地设置尽可能多的不同环境和OSes,以保持与最新版本的兼容性,并保持主开发操作系统的最新更新。

最初对理想世界的回答是,在理想的世界里,一切都是正确的:

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

代码语言:javascript
复制
-std=c++03 -pedantic

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

另外,还建议您(至少如果您也想修复这些警告):-Wall -Wextra

可悲的现实,看起来选择C++标准确实解决不了问题。据我所知,在gcc编译器中,这实际上不是一个问题,而是GNU C++标准库中的一个问题,它显然不检查所需的C++标准版本(#ifdef在头文件中)。如果它困扰您,您可能会考虑提交错误报告 (如果已经没有,尽管我没有在快速搜索中找到一个)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19866316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档