我有一个工具做循环绑定分析的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
然后用等效表达式替换begin
和end
。
接下来发生什么取决于这里的迭代器是什么。 它们是简单的指针吗? 如果是这样的话,问题可能就很容易解决了。 如果没有,你还有更多的工作要做。
最后,去掉所有引用,然后整理一下。
理想情况下,您希望将这些步骤作为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
,但是它也没有类。 如果您愿意,您也可以选择替换这些功能。