stdarg_runtime.c (1168B)
1 #include <stdarg.h> 2 3 static int sum_ints_twice(int n, ...) { 4 va_list ap; 5 va_list copy; 6 va_start(ap, n); 7 va_copy(copy, ap); 8 9 int local = 0; 10 for (int i = 0; i < n; ++i) local += va_arg(ap, int); 11 12 int copied = 0; 13 for (int i = 0; i < n; ++i) copied += va_arg(copy, int); 14 15 va_end(copy); 16 va_end(ap); 17 return local + copied; 18 } 19 20 static long sum_longs(int n, ...) { 21 va_list ap; 22 va_start(ap, n); 23 long total = 0; 24 for (int i = 0; i < n; ++i) total += va_arg(ap, long); 25 va_end(ap); 26 return total; 27 } 28 29 static int sum_ptrs(int n, ...) { 30 va_list ap; 31 va_start(ap, n); 32 int total = 0; 33 for (int i = 0; i < n; ++i) total += *va_arg(ap, int*); 34 va_end(ap); 35 return total; 36 } 37 38 static int sum_doubles(int n, ...) { 39 va_list ap; 40 va_start(ap, n); 41 double total = 0.0; 42 for (int i = 0; i < n; ++i) total += va_arg(ap, double); 43 va_end(ap); 44 return (int)total; 45 } 46 47 int test_main(void) { 48 int a = 10; 49 int b = 20; 50 int c = 12; 51 52 if (sum_ints_twice(3, 5, 7, 9) != 42) return 1; 53 if (sum_longs(3, 10L, 20L, 12L) != 42L) return 2; 54 if (sum_ptrs(3, &a, &b, &c) != 42) return 3; 55 if (sum_doubles(3, 10.0, 20.0, 12.0) != 42) return 4; 56 return 42; 57 }