2010-11-04 16 views
10

aşağıdaki iki makroları düşünün "ISO C99 kullanılmak üzere dinlenme argümanlar gerektiriyor" -pedantic seçeneğiyle derlenmiş zamanBastırma

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

ve complier doğru bu ama şikayet bir si var olan

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

: -std = c99 birçok kez bu hatayı alıyorum Dikkat etmediğim için bu uyarıyı bastırabilirim?

cevap

9

s argümanını varadik argümanlar ile birleştirin, böylece her zaman elipsin bir parçası olarak en az bir argümanınız olur.

#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

Makrolarınızın çevresinde disable uyarıları veya GCC'de pragma Warnings ile tamamen uyarıyı devre dışı bırakabilirsiniz. Ayrıca, -pedantic'u da kullanamazsınız, çünkü, iyi, pedantic.

+2

bilgiçlik kodunuzda yakalamak küçük hatalar yardımcı kullanmak çok iyi bir özelliktir: Bu aynı zamanda GCC ,## uzantısını kullanarak önler. Uyarılar göz ardı edilecek bir şey değildir. –

+0

@David: Elbette, ama soru "bu uyarıyı nasıl görmezden geldim" idi. '-pedantic' gerçekten gcc bağımlılıklarını yakalamak için kullanışlıdır. Uyarıları ile yakalanabilecek neredeyse tüm hataları yakalayacağız. – nmichaels

+0

Bu yanıt gerçekten bu uyarıyı devre dışı bırakmanıza yardımcı olmuyor. Ek olarak, en azından gcc 'pragma Warnings' desteklemiyor. –

2

## belirteci __VA_ARGS__ ile birlikte, ISO C99'un parçası olmayan bir gcc uzantısıdır. Bu yüzden uyarıyı alıyorsun.

1

Sizin için basit olana bağlı. P99 size gcc'nin ,## uzatılmasına gerek olmadığı Yani

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

böyle bir şey yaptığını izin verecek P99 conditionals vardır.

+0

Bu kabul edilen cevap olmalı. Çok daha zarif. – Barry

İlgili konular