2009-09-10 114 views
1

我试图弄清楚一个透明的解决方案,用于在我的游戏中重复出现的调试暂停。我可以制作一个HALT_ONCE宏吗?

对于一个微不足道的例子;说我在我的渲染器中停下来,告诉我什么时候尝试使用NULL材质。我的渲染器处理这个很好,但我仍然想知道我做错了什么。 这个暂停将立即击中每一帧,除非我手动禁用它。

这是代码ID喜欢变成一个宏(或别的东西,这就是透明的porssible)

#define HALT(errorMsg) printf(errorMsg);__asm { int 3 }; 
satic bool hitOnce = false; 
if (!hitOnce) 
{ 
    hitOnce = true; 
    HALT("its all gone wrong!") 
} 

的想法我有,是使创建此代码的宏,具有独特的每次布尔变量。目前我遇到的问题是,我不能在编译时增加数字来为每个HALT_ONCE生成唯一的静态布尔值。

+2

您可以使用'__COUNTER__'宏在编译时生成唯一的ID,但Evan Teran有更好的解决方案。 – 2009-09-10 15:01:16

回答

6

这有什么不对吗?

#define HALT_ONCE(err_msg) \ 
do { \ 
    static bool hitOnce = false; \ 
    if (!hitOnce) { \ 
     hitOnce = true; \ 
     printf(err_msg); \ 
     __asm { int 3 }; \ 
    } \ 
} while(0) 

然后,你可以做到这一点在你的代码:

HALT_ONCE("its all gone wrong!"); 

的DO /而创建自己的范围内,这使得hitOnce只存在很短的时间。我认为这将防止它与由此宏创建的其他hitOnce变量冲突。

+0

非常感谢,我现在看到我是如何以错误的方式思考问题的“独特”部分的。 – 2009-09-10 15:33:21

+1

我明白为什么范围需要大括号,但是do/while部分是否真的有必要? – Brian 2009-09-10 15:36:27

+5

@Brian:如果你想构造像'if(condition)HALT_ONCE(“”); else do_something_else();'正确解析。 – ephemient 2009-09-10 15:46:58

相关问题