2010-11-04 5 views
10

Tenir compte les deux macros suivantes:Réprimant "ISO C99 requiert des arguments reste à utiliser"

#define PNORM(v, s, ...) { \ 
    if(VERBOSITY_CHECK(v)) { \ 
    if((errno = pthread_mutex_lock(&server.output_mutex))) { \ 
     PERROR_LOCKFREE(normal, "\tpthread_mutex_lock failed on output_mutex.\r\n") ; \ 
    } \ 
    fprintf(stdout, s, ## __VA_ARGS__) ; \ 
    fflush(stdout) ; \ 
    if((errno = pthread_mutex_unlock(&server.output_mutex))) { \ 
     PERROR_LOCKFREE(normal, "\tpthread_mutex_unlock failed on output_mutex.\r\n") ; \ 
    } \ 
    } \ 
} 

#define PERROR_LOCKFREE(v, s, ...) { \ 
    if(VERBOSITY_CHECK(v)) { \ 
    PERRNO ;\ 
    fprintf(stderr, s, ## __VA_ARGS__) ; \ 
    fflush(stderr) ; \ 
    } \ 
} 

Considérons maintenant un exemple d'utilisation de ces derniers:

PNORM(verbose, "\tSomeText [%d] More [%p]\r\n", 0, ptr) ; 

Lorsque compilé avec l'option -pedantic et std = c99 Je reçois cette erreur plusieurs fois:

mycode.c:410:112: warning: ISO C99 requires rest arguments to be used 

Le complier est droit de se plaindre à ce sujet mais est-il si Comment puis-je supprimer cet avertissement puisque je m'en fous?

Répondre

9

Combinez l'argument s avec les arguments variadiques afin que vous ayez toujours au moins un argument dans l'ellipse. Cela vous permet également d'éviter d'utiliser l'extension ,## de GCC:

#define PNORM(v, ...) { \ 
    if(VERBOSITY_CHECK(v)) { \ 
    if((errno = pthread_mutex_lock(&server.output_mutex))) { \ 
     PERROR_LOCKFREE(normal, "\tpthread_mutex_lock failed on output_mutex.\r\n") ; \ 
    } \ 
    fprintf(stdout, __VA_ARGS__) ; \ 
    fflush(stdout) ; \ 
    if((errno = pthread_mutex_unlock(&server.output_mutex))) { \ 
     PERROR_LOCKFREE(normal, "\tpthread_mutex_unlock failed on output_mutex.\r\n") ; \ 
    } \ 
    } \ 
} 

#define PERROR_LOCKFREE(v, ...) { \ 
    if(VERBOSITY_CHECK(v)) { \ 
    PERRNO ;\ 
    fprintf(stderr, __VA_ARGS__) ; \ 
    fflush(stderr) ; \ 
    } \ 
} 
1

Vous pouvez disable avertissements tout autour de vos macros, ou désactiver l'avertissement spécifique entièrement avec pragma Warnings dans GCC. Vous ne pouvez pas non plus utiliser -pedantic, puisque c'est, eh bien, pédant.

+2

Pédant est un très bon point à utiliser pour aider les erreurs de prises mineures dans votre code. Les avertissements ne sont pas quelque chose à ignorer. –

+0

@David: Bien sûr, mais la question était "comment puis-je ignorer cet avertissement." '-pedantic' n'est vraiment utile que pour intercepter les dépendances gcc. '-Wall' attrapera presque tous les bogues qui peuvent être détectés par les avertissements. – nmichaels

+0

Cette réponse n'aide vraiment pas à désactiver cet avertissement. En outre, au moins ma version de gcc ne supporte PAS les avertissements pragma. –

2

Le jeton ## associé à __VA_ARGS__ est une extension gcc qui ne fait pas partie de la norme ISO C99. C'est pourquoi vous recevez l'avertissement.

1

Dépend de ce qui est simple pour vous. En P99 il y a P99 conditionals qui vous permettra faire quelque chose comme

#define USER_MACRO(...) P99_IF_DEC_LE(P99_NARG(__VA_ARGS__),2)(USER_MACRO2(__VA_ARGS__))(USER_MACRO3(__VA_ARGS__)) 

Donc, avec qu'il n'y a pas besoin de l'extension ,## de gcc.

+0

Ceci devrait être la réponse acceptée. Beaucoup plus élégant. – Barry

Questions connexes