| #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 (); |
| |
| return 0; |
| } |