我正在编写一个编译器,将某些旧版VB6程序迁移到C ++。我需要将VB6语言中的for语句转换为C ++ for语句:

For var = start To end Step S
  ...
Next var


天真的翻译将不起作用,因为S可能为负:

for (var = start; var <= end; var += S)


我想出了这个翻译,但是条件中的三元if很难看:

for (var = start; (S > 0) ? (var <= end) : (var >= end); var += S)

最佳答案

这是生成的代码。调试代码生成器时,您只会看到它。因此,如果它丑陋,则完全无关紧要。仅当它正确时才重要,然后生成的越简单越好。



更新:但是,如果是迁移,则尝试使代码可读即可。然后我要么:


尽可能确定操作员在翻译器中使用的步骤,因为步骤几乎总是恒定的。
隐藏辅助定义中的逻辑,并将基于范围的用于:

for(auto var : basic_range(start, end, S))


不幸的是boost::irange并没有达到C ++ 11的要求,它是像C ++一样使用半开范围定义的,即,当您想包含end时不包含它。因此,您必须自己定义范围。基本上,您只是将方向逻辑隐藏在其中,因此不会混淆代码。查看boost::irange以获得灵感。


无论如何,最大的问题是对象生命周期。 VB6(与早期的BASIC不同)被管理。因此,您可能最终会在大多数事情上使用智能指针,但这并不是最有效的事情。

09-07 04:37