Suppressing “ISO C99 requires rest arguments to be used”

匿名 (未验证) 提交于 2019-12-03 00:46:02

问题:

Consider the following two 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 ) ; \   } \ } 

Now consider an example use of these:

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

When compiled with the -pedantic option and -std=c99 I get this error many times:

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

The complier is right in complaining about this but is there a simple way I can suppress this warning since I don't care about it?

回答1:

Combine the s argument with the variadic arguments so that you always have at least one argument as part of the ellipsis. This also allows you to avoid using the ,## extension of 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:

The ## token in combination with __VA_ARGS__ is a gcc extension that's not part of ISO C99. That's why you're getting the warning.



回答3:

You can disable warnings just around your macros, or disable the specific warning entirely with pragma Warnings in GCC. You could also not use -pedantic, since it is, well, pedantic.



回答4:

Depends on what is simple for you. In P99 there are P99 conditionals that would allow you doing something like

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

So with that there is no need for the ,## extension of gcc.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!