1 #include <stdarg.h> 2 3 extern void abort (void); 4 extern void exit (int); 5 bar(int n,int c)6void bar (int n, int c) 7 { 8 static int lastn = -1, lastc = -1; 9 10 if (lastn != n) 11 { 12 if (lastc != lastn) 13 abort (); 14 lastc = 0; 15 lastn = n; 16 } 17 18 if (c != (char) (lastc ^ (n << 3))) 19 abort (); 20 lastc++; 21 } 22 23 #define D(N) typedef struct { char x[N]; } A##N; 24 D(0) D(1) D(2) D(3) D(4) D(5) D(6) D(7) 25 D(8) D(9) D(10) D(11) D(12) D(13) D(14) D(15) 26 D(16) D(31) D(32) D(35) D(72) 27 #undef D 28 foo(int size,...)29void foo (int size, ...) 30 { 31 #define D(N) A##N a##N; 32 D(0) D(1) D(2) D(3) D(4) D(5) D(6) D(7) 33 D(8) D(9) D(10) D(11) D(12) D(13) D(14) D(15) 34 D(16) D(31) D(32) D(35) D(72) 35 #undef D 36 va_list ap; 37 int i; 38 39 if (size != 21) 40 abort (); 41 va_start (ap, size); 42 #define D(N) \ 43 a##N = va_arg (ap, typeof (a##N)); \ 44 for (i = 0; i < N; i++) \ 45 bar (N, a##N.x[i]); 46 D(0) D(1) D(2) D(3) D(4) D(5) D(6) D(7) 47 D(8) D(9) D(10) D(11) D(12) D(13) D(14) D(15) 48 D(16) D(31) D(32) D(35) D(72) 49 #undef D 50 va_end (ap); 51 } 52 main(void)53int main (void) 54 { 55 #define D(N) A##N a##N; 56 D(0) D(1) D(2) D(3) D(4) D(5) D(6) D(7) 57 D(8) D(9) D(10) D(11) D(12) D(13) D(14) D(15) 58 D(16) D(31) D(32) D(35) D(72) 59 #undef D 60 int i; 61 62 #define D(N) \ 63 for (i = 0; i < N; i++) \ 64 a##N.x[i] = i ^ (N << 3); 65 D(0) D(1) D(2) D(3) D(4) D(5) D(6) D(7) 66 D(8) D(9) D(10) D(11) D(12) D(13) D(14) D(15) 67 D(16) D(31) D(32) D(35) D(72) 68 #undef D 69 70 foo (21 71 #define D(N) , a##N 72 D(0) D(1) D(2) D(3) D(4) D(5) D(6) D(7) 73 D(8) D(9) D(10) D(11) D(12) D(13) D(14) D(15) 74 D(16) D(31) D(32) D(35) D(72) 75 #undef D 76 ); 77 exit (0); 78 } 79