1/* Macro using defined with a hard-coded identifier (no parentheses) */ 2#define is_foo_defined defined /*...*/ foo 3#undef foo 4#if is_foo_defined 5failure 6#else 7success 8#endif 9#define foo 10#if is_foo_defined 11success 12#else 13failure 14#endif 15 16/* Macro using defined with a hard-coded identifier within parentheses */ 17#define is_foo_defined_parens defined /*...*/ ( /*...*/ foo /*...*/ ) // 18#define foo 19#if is_foo_defined_parens 20success 21#else 22failure 23#endif 24#undef foo 25#if is_foo_defined_parens 26failure 27#else 28success 29#endif 30 31/* Macro using defined with an argument identifier (no parentheses) */ 32#define is_defined(arg) defined /*...*/ arg 33#define foo bar 34#undef bar 35#if is_defined(foo) 36failure 37#else 38success 39#endif 40#define bar bar 41#if is_defined(foo) 42success 43#else 44failure 45#endif 46 47/* Macro using defined with an argument identifier within parentheses */ 48#define is_defined_parens(arg) defined /*...*/ ( /*...*/ arg /*...*/ ) // 49#define foo bar 50#define bar bar 51#if is_defined_parens(foo) 52success 53#else 54failure 55#endif 56#undef bar 57#if is_defined_parens(foo) 58failure 59#else 60success 61#endif 62 63/* Multiple levels of macro resulting in defined */ 64#define X defined A && Y 65#define Y defined B && Z 66#define Z defined C 67#define A 68#define B 69#define C 70#if X 71success 72#else 73failure 74#endif 75#undef A 76#if X 77failure 78#else 79success 80#endif 81#define A 82#undef B 83#if X 84failure 85#else 86success 87#endif 88#define B 89#undef C 90#if X 91failure 92#else 93success 94#endif 95