2012-09-29 3 views
1

J'utilise le compilateur g ++ et je souhaite que certaines lignes de mon code C++ soient commentées ou non commentées, en fonction de ma configuration.Débogage des commentaires et des macros C/C++

Je me rends compte que je pouvais faire:

#ifdef DEBUG 
cout << "foo" << endl; 
#endif 

Mais je préférerais tout être sur une seule ligne:

#define DEBUG // 
DEBUG cout << "foo" << endl; 

... avec DEBUG étant une macro pour //. Mais écrire #define DEBUG // ne donne rien. Quelqu'un peut-il me dire quoi faire?

Répondre

2

Mais je préférerais tout être sur une seule ligne:
#define DEBUG //

Les gens ont donné de bons exemples de la façon d'accomplir ce que vous voulez, mais personne n'a tenté d'expliquer pourquoi votre approche didn ne fonctionne pas.

Votre approche ne fonctionnera jamais. Ça ne peut pas marcher. Il n'y a pas de mécanisme pour définir une macro qui devient un début de séquence de commentaires pour la simple raison que les commentaires n'existent pas au moment où les symboles du préprocesseur sont définis. Ils ont déjà été dépouillés.

0

Il n'est pas idiomatique dans C. Préférez utiliser la forme habituelle, par exemple.:

#ifdef DEBUG 
    count << "foo" << endl; 
#endif 

Or (comme assert):

#ifndef NDEBUG 
    count << "foo" << endl; 
#endif 

Par souci de lisibilité. Vous pouvez également résumer ce code dans une macro:

#ifdef DEBUG 
#define PRINT_DEBUG(s) cout << s << endl 
#else 
#define PRINT_DEBUG(s) (void)0 
#endif 
4

est ici une façon de le faire:

#ifdef DEBUG 
#define DEBUG_LOG(x) std::cout << x << std::endl; 
#else 
#define DEBUG_LOG(x) 
#endif 

DEBUG_LOG("foo") 
+0

Également vous pouvez écrire 'DEBUG_LOG (" variable = "" variable); 'dans cette méthode, donc en utilisant tout ce que vous pouvez utiliser dans cout – PSIAlt

2

Une astuce d'un Dr. Dobbs article:

#if _DEBUG 
// dbgInC defined as "printf" or other custom debug function 
#define dbgInC printf 
// dbgInCpp defined as "cout" or other custom debug class 
#define dbgInCpp cout 
#else 
// dbgInC defined as null [1] 
#define dbgInC 
// dbgInCpp defined as "if(0) cerr" or "if(1); else cerr" 
#define dbgInCpp if(0) cerr 
#endif 

Cela a avantage d'autoriser les instructions multilignes:

dbgInCpp << "Debug in C++: " 
<< a // a is an integer 
<< b /* b is char array */ 
<< c // c is a float 
<< endl; 
+0

+1, Funny hack ... – md5

+0

+1. Vous avez réussi à le faire en une ligne, et cela fonctionne pour g ++. (Le manque de portabilité m'empêche de l'utiliser sur mon projet actuel.) – JellicleCat

0

Vous pourriez avoir

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

et utiliser dans vos choses de code comme

DBGOUT("x is " << x); 

J'utilise le symol NDEBUG, parce que <assert.h> et <cassert> utiliser.

Questions connexes