Подавление «ISO C99 требует использования остальных аргументов» - PullRequest
10 голосов
/ 04 ноября 2010

Рассмотрим следующие два макроса:

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

Теперь рассмотрим пример их использования:

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

При компиляции с опцией -pedantic и -std = c99 я получаюмного раз ошибка:

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

Компетент прав, когда жалуется на это, но есть ли простой способ, которым я могу подавить это предупреждение, так как мне все равно?

Ответы [ 4 ]

9 голосов
/ 04 ноября 2010

Объедините аргумент 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 ) ; \
  } \
}
2 голосов
/ 04 ноября 2010

Маркер ## в сочетании с __VA_ARGS__ является расширением gcc, которое не является частью ISO C99.Вот почему вы получаете предупреждение.

1 голос
/ 04 ноября 2010

Зависит от того, что для вас просто.В P99 есть P99 условных выражений , которые позволят вам сделать что-то вроде

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

Так что нет необходимости в ,## расширении gcc.

1 голос
/ 04 ноября 2010

Вы можете отключить предупреждения только вокруг ваших макросов или полностью отключить конкретное предупреждение с помощью pragma Warnings в GCC. Вы также не могли бы использовать -pedantic, так как это, ну, педантично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...