Препроцессор GNU C имеет специальную функцию , которая позволяет удалить запятую, когда нет аргументов, заполняющих часть переменной, добавив оператор вставки токена ##
к __VA_ARGS__
:
#define V1(str, ...) if(optv < 1); else printf("%s: "str,prog, ## __VA_ARGS__)
В качестве альтернативы, если вы хотите сохранить полную совместимость с C99, вы можете включить параметр многострочного формата в многоточие, но в этом случае вам также потребуется реорганизовать код, поскольку вы хотите включить дополнительныйprog
параметр между строкой формата и переменными.Примерно так может работать:
#define V1(...) if(optv < 1); else myprintf(prog, __VA_ARGS__)
int myprintf(const char *prog, const char *fmt, ...)
{
// Print out the program name, then forward the rest onto printf
printf("%s: ", prog);
va_list ap;
va_start(ap, fmt);
int ret = vprintf(fmt, ap);
va_end(ap);
return ret;
}
Затем V1("Output")
расширяется до myprintf(prog, "Output")
без использования каких-либо расширений компилятора, отличных от C99.
EDIT
Также обратите внимание, что я инвертировал условие if
в макросе из-за некоторых странных проблем, которые могут возникнуть, если вы вызываете макрос внутри оператора if
без фигурных скобок - см. этот FAQ дляподробное объяснение.