我可以制作一个HALT_ONCE宏吗?

Nat*_*ell 1 c++ debugging

我正试图找出一个透明的解决方案,用于在游戏中反复出现的调试暂停.

一个微不足道的例子; 说我在我的渲染器中停下来告诉我何时尝试使用NULL材质.我的渲染器处理这个问题,但我仍然想知道我做错了什么.除非我手动禁用它,否则此暂停将立即命中每一帧.

这是代码ID,可以变成一个宏(或其他像透明一样透明的东西)

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

我的想法是创建一个创建此代码的宏,每次都有一个唯一的bool变量.到目前为止我遇到的问题是我无法在编译时增加数字以为每个HALT_ONCE生成唯一的静态bool.

Eva*_*ran 6

这有什么不对吗?

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

然后你可以在你的代码中执行此操作:

HALT_ONCE("its all gone wrong!");
Run Code Online (Sandbox Code Playgroud)

do/while创建自己的范围,这使得hitOnce只存在很短的时间.我认为这可以防止它与此宏创建的其他hitOnce变量冲突.

  • @Brian:如果你想要像if(condition)HALT_ONCE("")这样的结构,这是必要的.否则do_something_else();`要正确解析. (5认同)