Haz*_*aza -4 c c++ loops code-translation
如何将像下面这样的循环转换为 C 风格?
for (auto element : vector) {
Do_Somethin();
}
Run Code Online (Sandbox Code Playgroud)
您首先将其转换为基于非范围的 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 > );确认。确认后,更换。不要猜测和交换类型并假设“它编译,我做对了”;这可能会导致细微的错误。
然后用等效的表达式替换begin和end。您必须进行一些研究(它可能是指向数组的原始指针,也可能是.begin方法,或者可能是begin范围表达式命名空间中的自由函数)。
接下来会发生什么取决于你的迭代器在这里。它们是简单的指针吗?如果是这样,问题可能很容易。如果没有,您还有更多工作要做。
最后,删除所有引用,然后整理。
理想情况下,您希望将这些步骤中的每一个都作为 git commit 执行,并通过单元测试确认行为没有改变。如果没有此类测试,您似乎没有资格进行这些更改。没关系,单元测试将有价值。
反过来说,有 C++ 到 C 的翻译器。它们在实践中会生成不可读和不可维护的代码。
但是输出可以由 C 编译器编译。