我想根据以下两种情况编写有条件编译的代码:
案例A:
for(int i = 1; i <= 10; ++i){
// do something...
}
CASE_B:(==!CASE_A)
{
const int i = 0;
// do something...
}
也就是说,在情况 A 中,我希望对变量 i
进行正常循环,但在情况 B 中,我想将局部范围变量 i
限制为仅一种特殊情况(此处指定为 i = 0
)。显然,我可以按照以下方式写一些东西:
for(int i = (CASE_A ? 1 : 0); i <= (CASE_A ? 10 : 0); ++i){
// do something
}
但是,我不喜欢这种设计,因为它不允许我在特殊情况 B 中利用 const
声明。这样的声明可能会像正文一样允许进行大量优化此循环的大部分受益于 i
的潜在编译时替换为其常量值。
期待社区提供有关如何有效实现这一目标的任何提示。
谢谢!
编辑:
CASE_A 与 CASE_B 可以在编译时求值。
i
没有作为引用传递
i
没有在主体中重新计算(否则 const
没有意义),但我不确定编译器是否会努力证明这一点
最佳答案
假设您没有过度简化您的示例,这应该无关紧要。假设 CASE_A 可以在编译时求值,代码:
for( int i = 0; i <= 0; ++i ) {
do_something_with( i );
}
将生成与以下相同的机器码:
const int i = 0;
do_something_with( i );
对于任何体面的编译器(当然,优化打开)。
在研究这个过程中,我发现这里有一个很好的点。如果 i
通过指针或引用传递给函数,编译器不能假定它没有改变。即使指针或引用是 const
也是如此! (因为 const
可以在函数中丢弃。)
关于C++ 使用 `const int` 作为循环变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5973159/