LINUX.ORG.RU

История изменений

Исправление xaizek, (текущая версия) :

Не понял эту магию с пробелами (не думал, что так можно), но может такой вариант подойдёт:


#define ITER( ...) ITER_(COUNT(__VA_ARGS__), __VA_ARGS__)
#define ITER_(n, ...) ITER__(n, __VA_ARGS__)
#define ITER__(n, ...) comb##n(__VA_ARGS__)

/* Neat trick to obtain number number of variadic arguments. */
#define COUNT(...) COUNT_(__VA_ARGS__, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
#define COUNT_(_1, _2, _3, _4, _5, _6, _7, _8, _9, n, ...) n

/* Helper macros to process variable arguments of macros. */
#define comb9(val, ...) func(val), comb8(__VA_ARGS__)
#define comb8(val, ...) func(val), comb7(__VA_ARGS__)
#define comb7(val, ...) func(val), comb6(__VA_ARGS__)
#define comb6(val, ...) func(val), comb5(__VA_ARGS__)
#define comb5(val, ...) func(val), comb4(__VA_ARGS__)
#define comb4(val, ...) func(val), comb3(__VA_ARGS__)
#define comb3(val, ...) func(val), comb2(__VA_ARGS__)
#define comb2(val, ...) func(val), comb1(__VA_ARGS__)
#define comb1(val)      func(val)

ITER(a, b, c, d, e, f)
gcc -E -o - macro.c
...
func(a), func(b), func(c), func(d), func(e), func(f)

P.S. Понял, наверное, __VA_ARGS__ нету, тогда не подойдёт.

Исправление xaizek, :

Не понял эту магию с пробелами (не думал, что так можно), но может такой вариант подойдёт:


#define ITER( ...) ITER_(COUNT(__VA_ARGS__), __VA_ARGS__)
#define ITER_(n, ...) ITER__(n, __VA_ARGS__)
#define ITER__(n, ...) comb##n(__VA_ARGS__)

/* Neat trick to obtain number number of variadic arguments. */
#define COUNT(...) COUNT_(__VA_ARGS__, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
#define COUNT_(_1, _2, _3, _4, _5, _6, _7, _8, _9, n, ...) n

/* Helper macros to process variable arguments of macros. */
#define comb9(val, ...) func(val), comb8(__VA_ARGS__)
#define comb8(val, ...) func(val), comb7(__VA_ARGS__)
#define comb7(val, ...) func(val), comb6(__VA_ARGS__)
#define comb6(val, ...) func(val), comb5(__VA_ARGS__)
#define comb5(val, ...) func(val), comb4(__VA_ARGS__)
#define comb4(val, ...) func(val), comb3(__VA_ARGS__)
#define comb3(val, ...) func(val), comb2(__VA_ARGS__)
#define comb2(val, ...) func(val), comb1(__VA_ARGS__)
#define comb1(val)      func(val)

ITER(a, b, c, d, e, f)
gcc -E -o - macro.c
...
func(a), func(b), func(c), func(d), func(e), func(f)

P.S. Понял, наверное, __VA_ARGS нету, тогда не подойдёт.

Исходная версия xaizek, :

Не понял эту магию с пробелами (не думал, что так можно), но может такой вариант подойдёт:


#define ITER( ...) ITER_(COUNT(__VA_ARGS__), __VA_ARGS__)
#define ITER_(n, ...) ITER__(n, __VA_ARGS__)
#define ITER__(n, ...) comb##n(__VA_ARGS__)

/* Neat trick to obtain number number of variadic arguments. */
#define COUNT(...) COUNT_(__VA_ARGS__, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
#define COUNT_(_1, _2, _3, _4, _5, _6, _7, _8, _9, n, ...) n

/* Helper macros to process variable arguments of macros. */
#define comb9(val, ...) func(val), comb8(__VA_ARGS__)
#define comb8(val, ...) func(val), comb7(__VA_ARGS__)
#define comb7(val, ...) func(val), comb6(__VA_ARGS__)
#define comb6(val, ...) func(val), comb5(__VA_ARGS__)
#define comb5(val, ...) func(val), comb4(__VA_ARGS__)
#define comb4(val, ...) func(val), comb3(__VA_ARGS__)
#define comb3(val, ...) func(val), comb2(__VA_ARGS__)
#define comb2(val, ...) func(val), comb1(__VA_ARGS__)
#define comb1(val)      func(val)

ITER(a, b, c, d, e, f)
gcc -E -o - macro.c
...
func(a), func(b), func(c), func(d), func(e), func(f)