- 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
 - 29
 - 30
 - 31
 - 32
 - 33
 - 34
 - 35
 - 36
 - 37
 - 38
 - 39
 - 40
 - 41
 - 42
 - 43
 - 44
 - 45
 - 46
 - 47
 - 48
 - 49
 - 50
 - 51
 - 52
 - 53
 - 54
 - 55
 - 56
 - 57
 - 58
 - 59
 - 60
 - 61
 - 62
 - 63
 - 64
 - 65
 - 66
 - 67
 - 68
 - 69
 - 70
 
                        #include <stdio.h>
#include <stdlib.h>
#define SPLICE(a,b) SPLICE_1(a,b)
#define SPLICE_1(a,b) SPLICE_2(a,b)
#define SPLICE_2(a,b) a##b
 
 
#define PP_ARG_N( \
          _1,  _2,  _3,  _4,  _5,  _6,  _7,  _8,  _9, _10, \
         _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, \
         _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, \
         _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, \
         _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, \
         _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, \
         _61, _62, _63, N, ...) N
 
/* Note 63 is removed */
#define PP_RSEQ_N()                                        \
         62, 61, 60,                                       \
         59, 58, 57, 56, 55, 54, 53, 52, 51, 50,           \
         49, 48, 47, 46, 45, 44, 43, 42, 41, 40,           \
         39, 38, 37, 36, 35, 34, 33, 32, 31, 30,           \
         29, 28, 27, 26, 25, 24, 23, 22, 21, 20,           \
         19, 18, 17, 16, 15, 14, 13, 12, 11, 10,           \
          9,  8,  7,  6,  5,  4,  3,  2,  1,  0
 
#define PP_NARG_(...)    PP_ARG_N(__VA_ARGS__)    
 
/* Note dummy first argument _ and ##__VA_ARGS__ instead of __VA_ARGS__ */
#define PP_NARG(...)     PP_NARG_(_, ##__VA_ARGS__, PP_RSEQ_N())
#define PRINT_1(a1) \
  printf(a1);
 
#define PRINT_2(a1, b1) \
  printf(a1, b1);
 
#define PRINT_3(a1, b1, a2) \
  PRINT_2(a1, b1); PRINT_1(a2)
 
#define PRINT_4(a1, b1, a2, b2) \
  PRINT_2(a1, b1); PRINT_2(a2, b2);
 
#define PRINT_5(a1, b1, a2, b2, a3) \
  PRINT_4(a1, b1, a2, b2); PRINT_1(a3);
 
#define PRINT_6(a1, b1, a2, b2, a3, b3) \
  PRINT_4(a1, b1, a2, b2); PRINT_2(a3, b3)
 
#define PRINT_7(a1, b1, a2, b2, a3, b3, a4) \
  PRINT_6(a1, b1, a2, b2, a3, b3); PRINT_1(a4)
 
#define PRINT_8(a1, b1, a2, b2, a3, b3, a4, b4) \
  PRINT_6(a1, b1, a2, b2, a3, b3);  PRINT_2(a4, b4);
//..... дальше лень ...
 
#define PRINTS_(N, ...) \
  SPLICE(PRINT_, N)(__VA_ARGS__)
 
#define PRINTS(...) \
  PRINTS_(PP_NARG(__VA_ARGS__), __VA_ARGS__)
int main(void)
{
    PRINTS("10 = %d", 10, "; 3 + 3 = %d", 3+3, "\n" );
    return EXIT_SUCCESS;
}