2009-09-10 6 views
1

J'essaie de trouver une solution transparente pour les arrêts de débogage qui se répètent à plusieurs reprises dans ma partie.Puis-je faire une macro HALT_ONCE?

Pour un exemple trivial; dis que j'ai un arrêt dans mon moteur de rendu qui me dit quand j'essaye d'utiliser un matériel NULL. Mon moteur de rendu gère bien mais je veux quand même savoir ce que je fais de mal. Cet arrêt touchera toutes les images à moins que je ne le désactive manuellement.

C'est l'identifiant de code comme de se transformer en une macro (ou quelque chose d'autre des thats aussi transparent que porssible)

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

L'idée que j'avais, était de faire une macro qui a créé ce code, avec un unique, bool variable à chaque fois. Le problème que j'ai rencontré jusqu'ici est que je ne peux pas incrémenter des nombres au moment de la compilation pour générer des boolos statiques uniques pour chaque HALT_ONCE.

+2

Vous pouvez utiliser la macro '__COUNTER__' pour générer des ID uniques lors de la compilation, mais Evan Teran a une meilleure solution. –

Répondre

6

quelque chose ne va pas avec ça?

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

Ensuite, vous pouvez simplement le faire dans votre code:

HALT_ONCE("its all gone wrong!"); 

Le do/while crée son propre champ qui fait hitOnce existe que pour un temps très court. Je pense que cela l'empêchera d'entrer en conflit avec d'autres variables hitOnce créées par cette macro.

+0

Un grand merci, je vois maintenant comment je pensais à la partie "unique" du problème à l'envers. –

+1

Je comprends pourquoi les accolades sont nécessaires pour la portée, mais la partie do/while est-elle vraiment nécessaire? – Brian

+5

@Brian: C'est nécessaire si vous voulez des constructions comme 'if (condition) HALT_ONCE (" "); else do_something_else(); 'pour analyser correctement. – ephemient

Questions connexes