2010-05-25 13 views
3

Pour des fins de débogage, je voudrais avoir une fonction printf_debug qui fonctionnerait comme la fonction standard printf, mais je n'imprimer si un DEBUG #DEFINE était vraiAide avec ma fonction printf

Je sais que je dois utiliser varagrs (...) mais je ne sais pas comment y arriver.

Merci d'avance.

Répondre

9

Plus facile à # définir simplement. Quelque chose comme ceci:

#ifdef DEBUG 
#define printf_debug printf 
#else 
#define printf_debug while(0)printf 
#endif 
+0

Je ne m'en souviens pas. C'est une réponse utile, cependant, je voudrais savoir comment réaliser ce que j'ai demandé avec Varargs. Merci quand même. Votez. – nunos

+3

+1. Nice et simple. Pourquoi réinventer la roue? –

+0

Pourquoi y a-t-il un 'printf' après 'while (0)'? –

2

Je ne sais pas exactement ce que vous voulez réaliser. Si vous voulez qu'un bloc de code s'exécute uniquement si DEBUG est défini, utilisez la directive du préprocesseur #ifdef.

#include <stdio.h> 
#include <stdarg.h> 
#define DEBUG 

void printf_debug(const char *format, ...) { 
    #ifdef DEBUG 
    va_list args; 
    va_start(args, format); 
    vprintf(format, args); 
    va_end(args); 
    #endif /* DEBUG */ 
} 
+1

Je sais que c'est l'idée de la fonction, mais ce code ne compile pas actully. Pourriez-vous fournir une fonction de travail? Merci. – nunos

+0

Le #ifdef sera toujours vrai. Les arguments de printf_debug ne sont pas valides (un ... ne peut suivre qu'un vrai argument). Les arguments ne sont pas passés à printf. Il y a un point-virgule manquant après l'instruction printf. Le printf est commenté. Il est commenté avec // ce qui n'est pas la norme C. –

+0

Je sais, je démontrais l'utilisation de #ifdef. Je vais modifier cela dans une minute. – Propeng

0

Vous devez utiliser les macros va_arg, elles sont utilisées pour accéder aux variables variadiques. Un lien utile: http://www.cppreference.com/wiki/c/other/va_arg. La référence est pour C++, mais ces macros peuvent aussi être utilisées en C.

Dans votre implémentation actuelle, vous placez le code en utilisant les variables variadiques dans un bloc #ifdef.

Mais si vous cherchez un appel régulier à printf, dépendant de DEBUG un simple #define agissant comme un alias fera l'affaire.

+0

Upvoted, mais vous devriez mentionner #include , puisque la référence que vous avez donné utilise la version C++

+0

lien fait référence à des fonctions mais je pense que nunos voulait une réponse en ce qui concerne les macros. Dans ce cas, les macros varidiques ont été ajoutées uniquement dans C99. –

2

Vous n'avez pas besoin d'utiliser vargs, les macros fonctionneront. Voici un exemple, qui sera fonction imprime et le numéro de ligne ainsi:

#ifdef DEBUG 
#define printf_debug(fmt, args...) printf("%s[%d]: "fmt, __FUNCTION__, __LINE__, ##args) 
#else 
#define printf_debug(fmt, args...) 
#endif 

Les args ## ici sera remplacée par la liste args, qui aime ce vargs fait dans l'appel de fonction.

0

Compilateur C99 uniquement!

#include <stdio.h> 

#define DEBUG 

#ifdef DEBUG 
#define debug(...) printf(__VA_ARGS__) 
#else 
#define debug while(0) 
#endif 

int main(int argc, char *argv[]) 
{ 
    debug("Only shows when DEBUG is defined!\n"); 
    return 0; 
} 

pour être honnête macros varidic ne sont pas nécessaires, vous pouvez simplement écrire facilement comme ceci:

#include <stdio.h> 

#define DEBUG 

#ifdef DEBUG 
#define debug printf 
#else 
#define debug while(0) 
#endif 

int main(int argc, char *argv[]) 
{ 
    debug("Only shows when DEBUG is defined!\n"); 
    return 0; 
} 

En y repensant, des informations de débogage devrait aller à stderr afin de ne pas interférer avec la sortie standard, donc celui-ci devrait être favorisé:

#include <stdio.h> 

#define DEBUG 

#ifdef DEBUG 
#define debug(...) fprintf(stderr, __VA_ARGS__) 
#else 
#define debug while(0) 
#endif 

int main(int argc, char *argv[]) 
{ 
    debug("Only shows when DEBUG is defined!\n"); 
    return 0; 
}