2010-11-04 12 views
10

considerar los siguientes dos macros:"ISO C99 requiere argumentos de descanso para ser utilizado"

#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) ; \ 
    } \ 
} 

Consideremos ahora un ejemplo de uso de éstos:

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

cuando se compila con la opción -pedantic y -std = c99 consigo este error muchas veces:

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

El compilador está justo en quejarse de esto, pero no es a si De la misma manera que puedo suprimir esta advertencia ya que no me importa?

Respuesta

9

Combinar el argumento s con los argumentos variadic para que siempre tiene al menos un argumento como parte de la elipsis. Esto también le permite evitar el uso de la extensión ,## 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

Puede disable advertencias alrededor de sus macros, o desactivar la advertencia específica por completo con pragma Warnings en GCC. Tampoco se podría utilizar -pedantic, ya que es, así, pedante.

+2

pedante es una característica muy buena de usar para ayudar a detectar errores menores en el código. Las advertencias no son algo para ignorar. –

+0

@ David: Claro, pero la pregunta era "¿cómo puedo ignorar esta advertencia." '-pedantic' realmente solo es útil para atrapar dependencias de gcc. '-Wall' atrapará a casi todos los errores detectados por las advertencias. – nmichaels

+0

Esta respuesta realmente no ayuda a desactivar la advertencia de que solo. Además, al menos mi versión de gcc NO es compatible con 'pragma Warnings'. –

2

El ## contador en combinación con __VA_ARGS__ es una extensión gcc que no es parte de la norma ISO C99. Es por eso que recibes la advertencia.

1

depende de lo que es simple para usted. En P99 hay P99 conditionals que le permitiría hacer algo como

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

Así que con eso no hay ninguna necesidad de que el ,## extensión del gcc.

+0

Esta debe ser la respuesta aceptada. Mucho más elegante. – Barry

Cuestiones relacionadas