抑制"ISO C99要求使用休息参数"

Dav*_*ond 10 c gcc posix variadic-functions gcc-warning

考虑以下两个宏:

#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 ) ; \
  } \
}
Run Code Online (Sandbox Code Playgroud)

现在考虑使用这些示例:

PNORM( verbose, "\tSomeText [%d] More [%p]\r\n", 0, ptr ) ;
Run Code Online (Sandbox Code Playgroud)

使用-pedantic选项和-std = c99编译时,我多次出现此错误:

mycode.c:410:112: warning: ISO C99 requires rest arguments to be used
Run Code Online (Sandbox Code Playgroud)

编者对此抱怨是对的,但有一种简单的方法可以抑制这个警告,因为我不关心它吗?

Ada*_*eld 9

s参数与可变参数组合在一起,以便始终至少有一个参数作为省略号的一部分.这也允许您避免使用,##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 ) ; \
  } \
}
Run Code Online (Sandbox Code Playgroud)