Préprocesseur de débogage Codeblocks

J’écris un programme C ++ avec Codeblocks et, à des fins de débogage, j’ai besoin de savoir si Building-Target of Codeblocks est défini sur “DEBUG” ou sur “RELEASE”.

J’ai déjà essayé ceci:

#ifdef DEBUG printf("Debug-Message"); #endif 

et ça

 #ifdef _DEBUG printf("Debug-Message"); #endif 

Mais aucun de ces mots n’est défini. Dois-je définir moi-même DEBUG et le modifier chaque fois que je modifie Building-Target ou y a-t-il un mot que je ne connais pas?

Dois-je définir moi-même DEBUG et le modifier chaque fois que je modifie Building-Target ou y a-t-il un mot que je ne connais pas?

Je ne sais pas quoi, si quelque chose est défini par défaut avec Code :: Blocks. Mais, si vous définissez vos propres #defines

 Project->Build options...->[Debug|Release]->#defines 

vous n’avez pas besoin de les changer lorsque vous passez d’une cible à une autre (DEBUG ou RELEASE). Il vous permet de définir des valeurs spécifiques à la génération Debug, ainsi que des valeurs spécifiques à la version Release.

Pour éviter d’avoir à le saisir manuellement à chaque fois pour chaque nouveau projet, vous pouvez créer un petit projet avec uniquement vos définitions de débogage / publication et l’enregistrer en tant que modèle de projet , puis créer de nouveaux projets à partir de ce modèle.

La manière habituelle, comme suggéré par la page de manuel et les habitudes de assert (3) (avec en C ou en C ++), consiste à définir NDEBUG en ligne de commande (par exemple, à comstackr avec gcc -Wall -DNDEBUG ) pour la compilation sans débogage. Dans votre Makefile vous pouvez CPPFLAGS += -DNDEBUG en mode publication (et comstackr avec g++ -Wall -g en mode débogage).

Ma propre habitude pourrait être d’avoir quelque chose comme

 #ifndef NDEBUG #define dbgprintf(Fmt,...) do{fprintf(stderr,"%s:%d:" Fmt "\n", \ __FILE__, __LINE__, \ ##__VA_ARGS__);}while(0) #else #define dbgprintf(Fmt,...) do{}while(0) #endif 

dans un fichier d’en-tête commun, et d’utiliser dbgprintf("i=%d", i) ailleurs dans le code. Notez que j’utilise une caténation de chaîne constante sur l’argument de macro Fmt , que j’y ajoute une nouvelle ligne constante et que ma sortie de débogage contient le nom du fichier source et le numéro de ligne (vous pouvez également utiliser __func__ si vous le souhaitez). En pur code C ++, je pourrais plutôt avoir

 #ifndef NDEBUG #define DBGOUT(Out) do{std::out << __FILE__ << ":" << __LINE__ \ << " " << Out << std::endl;}while(0) #else #define DBGOUT(Out) do{}while(0) #endif 

et utilisez DBGOUT("i=" << i) avec l'avantage d'utiliser des définitions spécifiques de l' operator << pour mes types.