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



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

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

您可以从将其转换为基于非范围的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 > );来确认。确认后,请更换。不要猜测和交换类型,并假设";它编译了,我做对了";;这可能会导致微妙的错误。

然后用等价的表达式替换beginend。你必须做一些研究(它可以是数组的原始指针,也可以是.begin方法,也可以在范围表达式的命名空间中是一个免费的begin函数(。

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

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

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


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

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

是的,您总是可以用ranged for来交换经典的for循环

要使ranged For工作,Chains必须是实现迭代器接口的类型,或者必须是数组。

如果它是一个数组,你知道该怎么做。

否则,您可以将循环写成:

for (auto it = Chains.begin(), end = Chains.end(); it != end; ++it)
{
auto block = *it;
Do_Somethin();
}

(不过,如果只有const接口可用,并且由于某种原因begin()没有const过载,则可能需要cbegin()。(

如果Chains类型支持operator[]的随机访问,您也可以尝试以下操作:

for (std::size_t i = 0; i < Chains.size(); ++it)
{
auto block = Chains[i];
Do_Somethin();
}

…不过您需要查看文档以了解.size()实际应该是什么。

当然,C没有迭代器或auto,但它也没有类。如果您愿意,也可以选择替换这些功能。

最新更新