我认为您可以通过对可能的代码路径进行更仔细的控制来解决此问题。例如,如果您要检查玩家的生命数是否已降至1以下,为什么不只在玩家失去生命时才检查而不是每帧?
void subtractPlayerLife() {
// Generic life losing stuff, such as mLives -= 1
if (mLives < 1) {
// Do specific stuff.
}
}
反过来,这假定subtractPlayerLife
仅在特定情况下才调用此方法,这可能是由于必须检查每个帧的条件(可能是冲突)导致的。
通过仔细控制代码的执行方式,您可以避免使用诸如静态布尔值之类的混乱解决方案,还可以逐个减少在单个帧中执行多少代码。
如果有些东西似乎无法重构,而您真的只需要检查一次,那么状态(如enum
)或静态布尔值是可行的方法。为了避免自己声明静态变量,可以使用以下技巧:
#define ONE_TIME_IF(condition, statement) \
static bool once##__LINE__##__FILE__; \
if(!once##__LINE__##__FILE__ && condition) \
{ \
once##__LINE__##__FILE__ = true; \
statement \
}
这将使以下代码:
while (true) {
ONE_TIME_IF(1 > 0,
printf("something\n");
printf("something else\n");
)
}
打印something
和something else
只有一次。它不会产生看起来最好的代码,但是可以工作。我也很确定有改进的方法,也许可以通过更好地确保唯一的变量名来实现。不过,这#define
在运行时只能运行一次。无法重置它,也无法保存它。
尽管有技巧,但我强烈建议您先更好地控制代码流,并将其#define
用作最后的手段,或者仅用于调试目的。