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.