- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
/*
https://habr.com/ru/post/523688/
Так как мы работаем с макросистемой C/C++, то аналог функций — макрос, этой
абстракцией мы и будем пользоваться. Мы будем передавать идентификатор первого
рекурсивного макроса в следующий рекурсивный макрос, и тот, в свою очередь, по
мере завершения своего исполнения будет передавать поток исполнения в первый
рекурсивный макрос, так называемое продолжение. Нам также понадобиться терминальное
продолжение — ML99_PRIV_REC_STOP — оно будет являться продолжением, поставляющимся
в самый-самый первый рекурсивный макрос, ведь логично, что никуда, кроме как
закончить исполнение программы на данном месте, нам перепрыгивать не нужно. Жилка
двигателя рекурсии — это цепочка из макросов-раскрывателей следующего вида:
*/
#define ML99_PRIV_REC_0(choice, ...) ML99_PRIV_REC_NEXT(1, choice)(__VA_ARGS__)
#define ML99_PRIV_REC_1(choice, ...) ML99_PRIV_REC_NEXT(2, choice)(__VA_ARGS__)
#define ML99_PRIV_REC_2(choice, ...) ML99_PRIV_REC_NEXT(3, choice)(__VA_ARGS__)
#define ML99_PRIV_REC_3(choice, ...) ML99_PRIV_REC_NEXT(4, choice)(__VA_ARGS__)
#define ML99_PRIV_REC_4(choice, ...) ML99_PRIV_REC_NEXT(5, choice)(__VA_ARGS__)
#define ML99_PRIV_REC_5(choice, ...) ML99_PRIV_REC_NEXT(6, choice)(__VA_ARGS__)
#define ML99_PRIV_REC_6(choice, ...) ML99_PRIV_REC_NEXT(7, choice)(__VA_ARGS__)
#define ML99_PRIV_REC_7(choice, ...) ML99_PRIV_REC_NEXT(8, choice)(__VA_ARGS__)
#define ML99_PRIV_REC_8(choice, ...) ML99_PRIV_REC_NEXT(9, choice)(__VA_ARGS__)
#define ML99_PRIV_REC_9(choice, ...) ML99_PRIV_REC_NEXT(10, choice)(__VA_ARGS__)
//...
//И так до 1023: