Этого код работает, как ожидалось, когда все 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" , ,);
С ,,
в конце.
Вы пытались запустить препроцессор и посмотреть на выход? 'cpp' или' gcc -E' в GCC. – effeffe
@effeffe Да, см. Править с выходом cpp –
вместо ', __VA_ARGS__', вы можете использовать', ## __VA_ARGS__'. –