La suppression de “la norme ISO C99 a besoin de repos arguments à être utilisé”
Considérer les deux macros:
#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:
PNORM( verbose, "\tSomeText [%d] More [%p]\r\n", 0, ptr ) ;
Lors de la compilation avec l'option-pédant option et -std=c99, j'obtiens cette erreur à plusieurs reprises:
mycode.c:410:112: warning: ISO C99 requires rest arguments to be used
Le compilateur est en droit de se plaindre de cela, mais est-t-il un moyen pour que je puisse supprimer cette alerte car je ne m'inquiète pas à ce sujet?
Vous devez vous connecter pour publier un commentaire.
Combiner les
s
argument avec les variadic arguments de sorte que vous avez toujours au moins un argument dans le cadre de l'ellipse. Cela permet également d'éviter d'utiliser le,##
extension de GCC:La
##
jeton en combinaison avec__VA_ARGS__
est un gcc extension qui ne fait pas partie de la norme ISO C99. C'est pourquoi vous obtenez le message d'avertissement.Vous pouvez désactiver avertissements juste autour de vos macros, ou de désactiver l'avertissement spécifique entièrement avec
pragma Warnings
dans GCC. Vous pourriez également de ne pas utiliser-pedantic
, car il est, ainsi, le pédant.-pedantic
est vraiment utile pour la capture de la gcc dépendances.-Wall
va attraper à peu près tous les bugs qui peut être pris par des avertissements.pragma Warnings
.Dépend de ce qui est simple pour vous. Dans P99 il y a P99 conditions qui vous permettra de faire quelque chose comme
Donc, avec cela il n'est pas nécessaire pour le
,##
extension de la gcc.