#include #include #include #include #include void dahl_invoke(void* data[], size_t ndata) { printf("ndata %lu\n", ndata); if (ndata == 0) { printf("No arguments\n"); return; } for (size_t i = 0; i < ndata; i++) { printf("%lu, %f\n", i, *(double*)data[i]); } } // 1. #define CALL_TEST(...) \ dahl_invoke((void*[]) { __VA_ARGS__ }, sizeof((void*[]) { __VA_ARGS__ }) / sizeof(void*)) // 2. #define CALL_TEST(...) do { \ void *args[] = { __VA_ARGS__ }; \ dahl_invoke(args, sizeof(args) / sizeof(args[0])); \ } while (0) // // 3. #define CALL_TEST(...) do { \ void *args[] = { NULL , __VA_ARGS__ }; \ dahl_invoke(args + 1, sizeof(args) / sizeof(args[0]) - 1); \ } while (0) // 4. #define CALL_TEST(...) do { \ void *ARGS_ __VA_OPT__([]) = \ __VA_OPT__({) NULL __VA_OPT__(, __VA_ARGS__ }); \ size_t NARGS_ = \ __VA_OPT__(sizeof ARGS_ / sizeof ARGS_[) 0 __VA_OPT__(] - 1); \ dahl_invoke(ARGS_ __VA_OPT__(+ 1), NARGS_); \ } while (0) int main(void) { double a = 67; double b = 42; double* ap = &a; double* bp = &b; CALL_TEST(ap, bp, ap); CALL_TEST(); return 0; }