【问题标题】:Should g++ 4.4.7 -std=gnu++0x compile the "for each" construct?g++ 4.4.7 -std=gnu++0x 应该编译“for each”构造吗?
【发布时间】:2013-07-23 01:20:39
【问题描述】:

我目前坚持使用 g++ 4.4.7,我尝试使用它(带有 -std=gnu++0x 标志)来编译使用“foreach”构造的 c++ 程序:

190: void
191: Block::get_record_types(D_RecordType_Vector& record_type_vector) const {
192:    for ( D_Record_Map::value_type rt_v_i  : _records) { 
193:
194:        record_type_vector.push_back(rt_v_i.first);
195:    }
196: }

第一个错误让我觉得它只是没有识别构造:

./c/Block.cpp:192: error: expected initializer before ':' token
./c/Block.cpp:196: error: expected primary-expression before '}' token
./c/Block.cpp:196: error: expected ';' before '}' token
./c/Block.cpp:196: error: expected primary-expression before '}' token
./c/Block.cpp:196: error: expected ')' before '}' token
./c/Block.cpp:196: error: expected primary-expression before '}' token
./c/Block.cpp:196: error: expected ';' before '}' token

这在 Apple clang-425 上正确编译。

我意识到 g++4.4.7 已经过时了,但考虑到编译器标志,它甚至不应该识别新结构吗?

【问题讨论】:

  • "要启用 C++0x 支持,请将命令行参数 -std=c++0x 添加到您的 g++ 命令行。或者,启用除 C++0x 扩展之外的 GNU 扩展,添加 -std=gnu++0x。GCC 4.7 及更高版本也支持 -std=c++11 和 -std=gnu++11。" C++0x/C++11 Support in GCC

标签: c++ c++11 foreach g++


【解决方案1】:

不,在 GCC 4.6 中添加了支持,请参阅 http://gcc.gnu.org/gcc-4.6/changes.html#cplusplushttp://gcc.gnu.org/projects/cxx0x.html

我意识到 g++4.4.7 已经过时了,但考虑到编译器标志,它甚至不应该识别新结构吗?

不,为什么要这样?您建议有人修改 C++ 解析器以理解新功能,只是为了拒绝它。那将是浪费时间——如果有人有时间修改解析器,为什么不添加对该功能的支持呢?否则他们必须修改代码,添加测试用例(测试它不支持该功能)等等。识别新语法的代码更改不会神奇地发生。

【讨论】:

  • 肯定 1 条关于未实现功能的错误消息比 7 条关于可疑语法错误的错误要好。
  • @JohannesSchaub-litb:实际上,使用没有-std=c++0x-std=c++11 的GCC 4.6+ 会给你一个很好的错误:range-based ‘for’ loops are not allowed in C++98 mode。也就是说,只要解析器升级以识别该功能,就会添加代码以接受它拒绝它,具体取决于使用的标准。
  • @JohannesSchaub-litb,是的,当然,这更好,但它不会免费发生,必须有人去做才能做到这一点。一旦有人有时间做这项工作,您就会得到支持一个在 C++98 模式下有用的错误,但预计 2009 年左右发布的 GCC 4.4 会出现错误充其量是乐观的。
  • 接受为答案,但 -1 表示编辑。我知道“某些功能是实验性的”,并认为 foreach 构造在当时至少是一种已知的可能性。
  • @Chap,不管这些特性是否是实验性的,为了让编译器能够识别新的语法必须有人去做,所以希望编译器能够理解每一种实验性的在标准化之前几年的语法是完全不现实的。这根本不是现实世界的运作方式。您能否展示 2009 年以来的 任何 编译器,它理解该语法吗?
【解决方案2】:

GCC 4.4.0 是 released April 23, 2009。基于范围的 for 循环的措辞是 finalized July 16, 2009。我不知道有任何编译器编写者具有预知能力。

【讨论】:

  • 您的回答更符合我的想法...即不是 4.4.7 编译器选择不实现该功能...而是该功能的要求不是t 已定义(又名“最终确定”)...如果没有明确定义的要求,您将无法实现功能(尤其是对于像 g++ 这样被数十亿人使用的复杂工具)。
猜你喜欢
  • 2013-02-13
  • 2012-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
  • 2012-05-15
  • 2015-01-05
相关资源
最近更新 更多