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