| /* Macro using defined with a hard-coded identifier (no parentheses) */ |
| #define is_foo_defined defined /*...*/ foo |
| #undef foo |
| #if is_foo_defined |
| failure |
| #else |
| success |
| #endif |
| #define foo |
| #if is_foo_defined |
| success |
| #else |
| failure |
| #endif |
| |
| /* Macro using defined with a hard-coded identifier within parentheses */ |
| #define is_foo_defined_parens defined /*...*/ ( /*...*/ foo /*...*/ ) // |
| #define foo |
| #if is_foo_defined_parens |
| success |
| #else |
| failure |
| #endif |
| #undef foo |
| #if is_foo_defined_parens |
| failure |
| #else |
| success |
| #endif |
| |
| /* Macro using defined with an argument identifier (no parentheses) */ |
| #define is_defined(arg) defined /*...*/ arg |
| #define foo bar |
| #undef bar |
| #if is_defined(foo) |
| failure |
| #else |
| success |
| #endif |
| #define bar bar |
| #if is_defined(foo) |
| success |
| #else |
| failure |
| #endif |
| |
| /* Macro using defined with an argument identifier within parentheses */ |
| #define is_defined_parens(arg) defined /*...*/ ( /*...*/ arg /*...*/ ) // |
| #define foo bar |
| #define bar bar |
| #if is_defined_parens(foo) |
| success |
| #else |
| failure |
| #endif |
| #undef bar |
| #if is_defined_parens(foo) |
| failure |
| #else |
| success |
| #endif |
| |
| /* Multiple levels of macro resulting in defined */ |
| #define X defined A && Y |
| #define Y defined B && Z |
| #define Z defined C |
| #define A |
| #define B |
| #define C |
| #if X |
| success |
| #else |
| failure |
| #endif |
| #undef A |
| #if X |
| failure |
| #else |
| success |
| #endif |
| #define A |
| #undef B |
| #if X |
| failure |
| #else |
| success |
| #endif |
| #define B |
| #undef C |
| #if X |
| failure |
| #else |
| success |
| #endif |