C++ 如何转换C++;循环转换成C风格的循环?

C++ 如何转换C++;循环转换成C风格的循环?,c++,c,loops,code-translation,C++,C,Loops,Code Translation,如何将下面这样的循环转换为C风格 for (auto element : vector) { Do_Somethin(); } 是的,您可以随时交换经典for循环。 要使ranged For工作,链必须是实现迭代器接口的类型,或者必须是数组 如果它是一个数组,你知道该怎么做 否则,可以将循环编写为: for (auto it = Chains.begin(), end = Chains.end(); it != end; ++it) { auto block = *it; D

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

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

是的,您可以随时交换经典for循环。

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

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

否则,可以将循环编写为:

for (auto it = Chains.begin(), end = Chains.end(); it != end; ++it)
{
   auto block = *it;
   Do_Somethin();
}
(但是,如果由于某种原因,
cbegin()
只有一个const接口可用,并且
begin()
没有
const
重载,则可能需要
cbegin()

如果
链的类型
支持使用
操作符[]
进行随机访问,您也可以尝试以下操作:

for (std::size_t i = 0; i < Chains.size(); ++it)
{
   auto block = Chains[i];
   Do_Somethin();
}
for(std::size_t i=0;i
…尽管您需要查看文档以了解
.size()
实际上应该是什么


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

您可以从将其转换为基于非范围的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
变量是什么。如果必须猜测,则执行
静态断言(std::is__v以确认。确认后,请更换。不要猜测和交换类型,并假设“它可以编译,我做对了”;这可能会导致微妙的错误

然后用等效表达式替换
begin
end
。您必须进行一些研究(它可以是数组的原始指针,也可以是
.begin
方法,也可以是范围表达式名称空间中的免费
begin
函数)

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

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

理想情况下,您希望以git提交的方式执行这些步骤,并通过单元测试确认行为没有变化。未经此类测试,您似乎没有资格进行这些更改。这是可以的,单元测试将是有价值的


P>另一方面,有C++到C译者。在实践中,它们将生成不可读和不可维护的代码


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

是否有工具?
…建议:不要将代码从一种语言翻译成另一种语言。即使代码有或多或少的直译,在新程序的上下文中也可能没有意义。理解原始程序的可观察行为,并使用新语言的习惯用法并遵循其最佳实践在新语言中实现相同的行为。然后彻底测试两个程序,以确保可观察到的行为是相同的。要做到这一点,你需要对两种语言都有很好的理解。@ HazemAbaza -C和C++是两种不同的语言。@ HAZEMABAZ-但是为什么你需要对基于<代码>的< <代码>的边界分析?它已经有了内置的边界分析。有没有方法可以用于C++代码?不要问工具的供应商,如果他们有类似的工具,但C++。除非它是一个随机存取容器,有<代码>操作符[]/COD>。@ SuxeNy好,我想这会看起来有点像C。但我的观点是,您仍然会使用非C特性,比如
operator[]
C
没有
auto
类型。另外,在
c
中进行初始化,通常在循环外部进行