fonction wrapper printf qui filtre selon les préférences de l'utilisateur

fonction wrapper printf qui filtre selon les préférences de l'utilisateur

Vous voulez appeler vprintf() au lieu de printf() en utilisant les capacités des arguments variables "varargs" de C.

#include <stdarg.h>

int write_log(int priority, const char *format, ...)
{
    va_list args;
    va_start(args, format);

    if(priority & PRIO_LOG)
            vprintf(format, args);

    va_end(args);
}

Pour plus d'informations, voir quelque chose dans ce sens.


Je pense que l'idée de Jeff est la voie à suivre, mais vous pouvez également accomplir cela avec une macro sans utiliser vprintf. Cela peut nécessiter gcc :

#define write_log(priority,format,args...)        \
                  if (priority & PRIO_LOG) {      \ 
                      printf(format, ## args);    \
                  }

Vérifiez ici pour plus d'informations sur la façon dont cela fonctionne.


Si vous voulez que les définitions PRIO_* soient utilisées comme bit (en utilisant | et &), vous devez donner à chacune d'elles son propre bit :

unsigned short PRIO_HIGH = 0x0001;
unsigned short PRIO_NORMAL = 0x0002;
unsigned short PRIO_LOW = 0x0004;

La macro peut être améliorée en utilisant la notation do { } while (0). Cela fait que les appels à write_log agissent plus comme une instruction.

#define write_log(priority,format,args...) do { \
    if (priority & PRIO_LOG) { \
        printf(format, ## args); \
    } while(0)