#include #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 /* A macro named UNTIL_ is #defined until just before the definition of the function . A macro named BEFORE_ is not #defined until just before the definition of . The macro WHERE is redefined before each function to the token list ``before ''. 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"); } 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 (); }