【发布时间】:2011-05-12 04:00:43
【问题描述】:
我想编写有条件编译的代码,根据以下两种情况:
CASE_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 没有意义),但我不确定编译器是否会努力证明这一点
【问题讨论】:
-
从实际的角度来看,如果解决方案适合整体语义,例如,通过
#define Smart_Loop(i) ...宏将用作:for(Smart_Loop(i)){ ... } -
说真的,我敢打赌,不管你如何定义它,你的小循环无论如何都会展开或优化出来。如果您不将其地址带到任何地方,每个称职的编译器都将能够删除
int i。和const int i一样,只有不取地址才能删除。 -
我推测编译器应该能够为您优化这种情况。因此,您应该编写以后最容易阅读和维护的代码。
标签: c++ conditional-compilation