c++ - 如何将 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 > );
确认。确认后更换。不要猜测和交换类型并假设“它编译,我做对了”;这可能会导致细微的错误。
然后将begin
and替换end
为等效表达式。您必须进行一些研究(它可能是指向数组的原始指针,也可能是方法,也可能是范围表达式命名空间中的.begin
自由函数)。begin
接下来会发生什么取决于您的迭代器在这里。它们是简单的指针吗?如果是这样,问题可能很简单。如果没有,你还有更多工作要做。
最后,删除所有引用,然后整理一下。
理想情况下,您希望将这些步骤中的每一个都作为 git 提交执行,并通过单元测试确认行为没有变化。未经此类测试,您似乎没有资格进行这些更改。没关系,单元测试将有价值。
反过来说,有 C++ 到 C 的翻译器。他们将在实践中生成不可读和不可维护的代码。
但是输出可以由 C 编译器编译。
推荐阅读
- go - 为什么 go-jaeger-client 需要度量和日志的包装器?
- reactjs - 为什么 Scrollspy 未在反应应用程序中加载?
- java - 异步回调和监听器
- sql - 如何在 SQL Server 脚本中使用临时表?
- python - python内存因循环而爆炸
- php - 我们可以在 php 中使用和操作 mysql 数据吗?
- vue.js - vue-material 本地化主题避免冲突
- android - Mpandroidchart 无法根据需要对数据进行分组?
- reactjs - 是否可以在反应中跳过 componentDIdMount Lifecycle 方法?
- ios - 将 DatePicker 日期转换为 UTC 格式返回 NULL