如何将 C++ 循环转换为 C 风格的循环?

Haz*_*aza -4 c c++ loops code-translation

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

for (auto element : vector) {
   Do_Somethin();
}
Run Code Online (Sandbox Code Playgroud)

Yak*_*ont 6

您首先将其转换为基于非范围的 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
  }
}
Run Code Online (Sandbox Code Playgroud)

然后你把每一块都拆开。

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

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

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

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

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


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

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