提问者:小点点

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


我有一个工具做循环绑定分析的C代码,有一个方法使用它的C++代码吗? 我怎样才能把像下面这样的循环翻译成C风格呢?

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

共2个答案

匿名用户

首先将其转换为非基于范围的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来确认。 确认后,更换。

然后用等效表达式替换beginend

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

最后,去掉所有引用,然后整理一下。

理想情况下,您希望将这些步骤作为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();
}

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

如果的类型支持使用运算符[]进行随机访问,您也可以尝试如下所示:

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

…但是您需要查看文档来确定.size()实际上应该是什么。

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

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(如何将|c++|循环|转|换为|c|风格|循环)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?