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 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | #include <stdio.h> #define SPLICE(a, b) INNER_SPLICE(a, b) #define INNER_SPLICE(a, b) a ## b #define STRINGIFY(a) INNER_STRINGIFY(a) #define INNER_STRINGIFY(a) #a #define FIFTY_SEVEN 57 #define FORTY_EIGHT 48 #undef FORTY_EIGHT struct outer { struct fields { struct fault { int addr; } fault; } fields; }; struct outer address; #define addr fields.fault.addr /* A macro named UNTIL_<func> is #defined until just before the definition of the function <func>. A macro named BEFORE_<func> is not #defined until just before the definition of <func>. The macro WHERE is redefined before each function <func> to the token list ``before <func>''. The macscp IN_MACSCP2_H and IN_MACSCP3_H are defined while processing those header files; macscp4.h uses them to choose appropriate function names, output strings, and macro definitions. */ #define UNTIL_MACSCP1_1 #define UNTIL_MACSCP2_1 #define UNTIL_MACSCP4_1_FROM_MACSCP2 #define UNTIL_MACSCP4_2_FROM_MACSCP2 #define UNTIL_MACSCP2_2 #define UNTIL_MACSCP1_2 #define UNTIL_MACSCP3_1 #define UNTIL_MACSCP4_1_FROM_MACSCP3 #define UNTIL_MACSCP4_2_FROM_MACSCP3 #define UNTIL_MACSCP3_2 #define UNTIL_MACSCP1_3 #define WHERE before macscp1_1 #define BEFORE_MACSCP1_1 #undef UNTIL_MACSCP1_1 void macscp1_1 () { puts ("macscp1_1"); } #include "macscp2.h" #undef WHERE #define WHERE before macscp1_2 #define BEFORE_MACSCP1_2 #undef UNTIL_MACSCP1_2 void macscp1_2 () { puts ("macscp1_2"); } #include "macscp3.h" #undef WHERE #define WHERE before macscp1_3 #define BEFORE_MACSCP1_3 #undef UNTIL_MACSCP1_3 void macscp1_3 () { puts ("macscp1_3"); } void macscp_expr (void) { int foo = -1; foo = 0; /* set breakpoint here */ #define MACRO_TO_EXPAND foo foo = 1; /* set second breakpoint here */ #undef MACRO_TO_EXPAND foo = 2; /* stopping point for line test */ } #define TWENTY_THREE 23 int main (int argc, char **argv) { macscp1_1 (); macscp2_1 (); macscp4_1_from_macscp2 (); macscp4_2_from_macscp2 (); macscp2_2 (); macscp1_2 (); macscp3_1 (); macscp4_1_from_macscp3 (); macscp4_2_from_macscp3 (); macscp3_2 (); macscp1_3 (); macscp_expr (); } |