2009-09-10 4 views
1

Я пытаюсь понять прозрачное решение для отладочных остановок, которые неоднократно попадают в мою игру.Могу ли я сделать макрос HALT_ONCE?

Для тривиального примера; скажем, у меня есть остановка в моем рендерере, который говорит мне, когда я пытаюсь использовать материал NULL. Мой рендерер справляется с этим, но я все еще хочу знать, что я делаю неправильно. Эта остановка ударит каждый кадр, если я не отключу его вручную.

Это код ид нравится, чтобы включить в макрос (или что-то еще то будет прозрачной, как porssible)

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

Идея я был, должен был сделать макрос, который создал этот код, с уникальным bool каждый раз. Проблема, с которой я столкнулся до сих пор, заключается в том, что я не могу увеличивать числа во время компиляции для создания уникальных статических bool для каждого HALT_ONCE.

+2

Вы можете использовать макрос '__COUNTER__' для генерации уникальных идентификаторов во время компиляции, но у Evan Teran есть лучшее решение. –

ответ

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!"); 

Д.О. /, а создает свою область, что делает hitOnce существует только в течение очень короткого промежутка времени. Я думаю, это предотвратит конфликты с другими переменными hitOnce, созданными этим макросом.

+0

Огромное спасибо, теперь я вижу, как я думал о «уникальной» части проблемы не так. –

+1

Я понимаю, зачем нужны фигурные скобки для области видимости, но действительно ли нужна часть do/while? – Brian

+5

@Brian: Это необходимо, если вам нужны конструкции типа 'if (condition) HALT_ONCE (" "); else do_something_else(); 'правильно разобрать. – ephemient

Смежные вопросы