101e04c3fSmrg/* Macro using defined with a hard-coded identifier (no parentheses) */
201e04c3fSmrg#define is_foo_defined defined /*...*/ foo
301e04c3fSmrg#undef foo
401e04c3fSmrg#if is_foo_defined
501e04c3fSmrgfailure
601e04c3fSmrg#else
701e04c3fSmrgsuccess
801e04c3fSmrg#endif
901e04c3fSmrg#define foo
1001e04c3fSmrg#if is_foo_defined
1101e04c3fSmrgsuccess
1201e04c3fSmrg#else
1301e04c3fSmrgfailure
1401e04c3fSmrg#endif
1501e04c3fSmrg
1601e04c3fSmrg/* Macro using defined with a hard-coded identifier within parentheses */
1701e04c3fSmrg#define is_foo_defined_parens defined /*...*/ ( /*...*/ foo /*...*/ ) //
1801e04c3fSmrg#define foo
1901e04c3fSmrg#if is_foo_defined_parens
2001e04c3fSmrgsuccess
2101e04c3fSmrg#else
2201e04c3fSmrgfailure
2301e04c3fSmrg#endif
2401e04c3fSmrg#undef foo
2501e04c3fSmrg#if is_foo_defined_parens
2601e04c3fSmrgfailure
2701e04c3fSmrg#else
2801e04c3fSmrgsuccess
2901e04c3fSmrg#endif
3001e04c3fSmrg
3101e04c3fSmrg/* Macro using defined with an argument identifier (no parentheses) */
3201e04c3fSmrg#define is_defined(arg) defined /*...*/ arg
3301e04c3fSmrg#define foo bar
3401e04c3fSmrg#undef bar
3501e04c3fSmrg#if is_defined(foo)
3601e04c3fSmrgfailure
3701e04c3fSmrg#else
3801e04c3fSmrgsuccess
3901e04c3fSmrg#endif
4001e04c3fSmrg#define bar bar
4101e04c3fSmrg#if is_defined(foo)
4201e04c3fSmrgsuccess
4301e04c3fSmrg#else
4401e04c3fSmrgfailure
4501e04c3fSmrg#endif
4601e04c3fSmrg
4701e04c3fSmrg/* Macro using defined with an argument identifier within parentheses */
4801e04c3fSmrg#define is_defined_parens(arg) defined /*...*/ ( /*...*/ arg /*...*/ ) //
4901e04c3fSmrg#define foo bar
5001e04c3fSmrg#define bar bar
5101e04c3fSmrg#if is_defined_parens(foo)
5201e04c3fSmrgsuccess
5301e04c3fSmrg#else
5401e04c3fSmrgfailure
5501e04c3fSmrg#endif
5601e04c3fSmrg#undef bar
5701e04c3fSmrg#if is_defined_parens(foo)
5801e04c3fSmrgfailure
5901e04c3fSmrg#else
6001e04c3fSmrgsuccess
6101e04c3fSmrg#endif
6201e04c3fSmrg
6301e04c3fSmrg/* Multiple levels of macro resulting in defined */
6401e04c3fSmrg#define X defined A && Y
6501e04c3fSmrg#define Y defined B && Z
6601e04c3fSmrg#define Z defined C
6701e04c3fSmrg#define A
6801e04c3fSmrg#define B
6901e04c3fSmrg#define C
7001e04c3fSmrg#if X
7101e04c3fSmrgsuccess
7201e04c3fSmrg#else
7301e04c3fSmrgfailure
7401e04c3fSmrg#endif
7501e04c3fSmrg#undef A
7601e04c3fSmrg#if X
7701e04c3fSmrgfailure
7801e04c3fSmrg#else
7901e04c3fSmrgsuccess
8001e04c3fSmrg#endif
8101e04c3fSmrg#define A
8201e04c3fSmrg#undef B
8301e04c3fSmrg#if X
8401e04c3fSmrgfailure
8501e04c3fSmrg#else
8601e04c3fSmrgsuccess
8701e04c3fSmrg#endif
8801e04c3fSmrg#define B
8901e04c3fSmrg#undef C
9001e04c3fSmrg#if X
9101e04c3fSmrgfailure
9201e04c3fSmrg#else
9301e04c3fSmrgsuccess
9401e04c3fSmrg#endif
95