2013-01-02 4 views
0

Этого код работает, как ожидалось, когда все PARAMS передается HTML_A:Игнорировать пустой VARIADIC Params

#include <stdio.h> 

#define HTML_A_fmt_void 
#define HTML_A_arg_void 
#define HTML_A_fmt_link(fmt, ...) " href=\""fmt"\"" 
#define HTML_A_arg_link(fmt, ...) ,__VA_ARGS__ 
#define HTML_A_fmt_text(fmt, ...) fmt 
#define HTML_A_arg_text(fmt, ...) ,__VA_ARGS__ 
#define HTML_A(link, text) \ 
    printf("<a" HTML_A_fmt_##link ">" HTML_A_fmt_##text "</a>\n" HTML_A_arg_##link HTML_A_arg_##text) 

int main(void) 
{ 
    HTML_A(
     link("%s", "http://wwww.google.com"), 
     text("%s", "Visit google") 
    ); 
    HTML_A(
     link("%s", "http://wwww.google.com"), 
     void 
    ); 
    HTML_A(
     void, 
     text("%s", "Visit google") 
    ); 
    HTML_A(
     void, 
     void 
    ); 
    return 0; 
} 

Но если я хочу позвонить HTML_A без аргументов в формате:

HTML_A(
    link("http://wwww.google.com"), 
    text("Visit google") 
); 

Я получаю эту компиляцию ошибка при НКУ:

demo.c:17:1: warning: ISO C99 requires rest arguments to be used
demo.c: In function ‘main’:
demo.c:17: error: expected expression before ‘,’ token

CPP возвращается:

printf("<a" " href=\"""http://wwww.google.com""\"" ">" "Visit google" "</a>\n" , ,); 

С ,, в конце.

+1

Вы пытались запустить препроцессор и посмотреть на выход? 'cpp' или' gcc -E' в GCC. – effeffe

+0

@effeffe Да, см. Править с выходом cpp –

+1

вместо ', __VA_ARGS__', вы можете использовать', ## __VA_ARGS__'. –

ответ

3

Чтобы препроцессор для правильной работы, вы должны использовать «оператор» конкатенации (который имеет особое значение в этом контексте): вместо

, __VA_ARGS__ 

записи

, ## __VA_ARGS__ 

и он должен работать должным образом.