首页 > 解决方案 > 如何将 C++ 循环转换为 C 风格的循环?

问题描述

如何将像下面这样的循环转换为 C 风格?

for (auto element : vector) {
   Do_Somethin();
}

标签: c++cloopscode-translation

解决方案


您首先将其转换为基于非范围的 for 循环。

{
  auto&& range = Chains;
  using std::begin; using std::end; // possibly cbegin/cend
  auto it = begin(range); // possibly cbegin
  auto end = end(range); // possibly cend
  for(; it!=end; ++it) {
    auto block = *it;
    // body of loop
  }
}

然后你把每一块都分开。

首先推断auto变量是什么。猜猜你是否必须,然后做一个static_assert( std::is_same_v< decltype(begin), your_guess > );确认。确认后更换。不要猜测和交换类型并假设“它编译,我做对了”;这可能会导致细微的错误。

然后将beginand替换end为等效表达式。您必须进行一些研究(它可能是指向数组的原始指针,也可能是方法,也可能是范围表达式命名空间中的.begin自由函数)。begin

接下来会发生什么取决于您的迭代器在这里。它们是简单的指针吗?如果是这样,问题可能很简单。如果没有,你还有更多工作要做。

最后,删除所有引用,然后整理一下。

理想情况下,您希望将这些步骤中的每一个都作为 git 提交执行,并通过单元测试确认行为没有变化。未经此类测试,您似乎没有资格进行这些更改。没关系,单元测试将有价值。


反过来说,有 C++ 到 C 的翻译器。他们将在实践中生成不可读和不可维护的代码。

但是输出可以由 C 编译器编译。


推荐阅读