10

次の2つのマクロについて考えてみます。

#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

4 に答える 4

9

s省略記号の一部として常に少なくとも1つの引数を持つように、引数を可変個引数の引数と組み合わせます。,##これにより、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 ) ; \
  } \
}
于 2010-11-04T20:57:18.763 に答える
2

##と組み合わせたトークン__VA_ARGS__は、ISOC99の一部ではないgcc拡張機能です。そのため、警告が表示されます。

于 2010-11-04T20:36:00.857 に答える
1

あなたにとって何が簡単かによります。P99には、次のようなことを可能にするP99条件文があります。

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

,##したがって、gccを拡張する必要はありません。

于 2010-11-04T20:52:34.500 に答える
1

マクロのすぐ近くで警告を無効にすることもpragma Warnings、GCCで特定の警告を完全に無効にすることもできます。-pedanticそれは、まあ、衒学者なので、あなたも使うことができませんでした。

于 2010-11-04T20:05:10.617 に答える