2009-09-10 118 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

相關問題