В P99 У меня есть два макроса
#define P00_ARG( \
_1, _2, _3, _4, _5, _6, _7, _8, \
_9, _10, _11, _12, _13, _14, _15, _16, \
... etc ... \
_153, _154, _155, _156, _157, _158, _159, \
...) _159
#define P99_HAS_COMMA(...) P00_ARG(__VA_ARGS__, \
1, 1, 1, 1, 1, 1, 1, \
1, 1, 1, 1, 1, 1, 1, 1, \
... etc .... \
1, 1, 1, 1, 1, 1, 0, 0)
Вы можете использовать эту функцию, чтобы определить, если ваш аргумент имеет запятую (так аргументов больше, чем ваш формат) или нет (только формат). Затем вы можете использовать это для построения вызова одного из двух макросов:
#define log(...) log2(P99_HAS_COMMA(__VA_ARGS__), __VA_ARGS__)
#define log2(N, ...) log3(N, __VA_ARGS__)
#define log3(N, ...) log ## N(__VA_ARGS__)
#define log0(FMT) /* your version with format only goes here */
#define log1(FMT, __VA_ARGS__) /* your version with more goes here */
Непосредственно, связанный с вашим вопросом, но этот макрос будет обрабатывать аргументы дважды. например, «log (« foo% d », func());' вызовет func дважды. Чтобы исправить это, вы можете сделать функцию, например. 'my_log_pack (char const *, ...);' который обрабатывает свой список параметров дважды. –