I have never worked with #if, #ifdef, #ifndef, #else, #elif and #endif
Conditional compilation means ifdef-ed out code is never actually in the final linked application. Just using language conditionals means both branches are in the final code making it bigger and potentially harder to test etc.
Use #ifdef
etc when you know at compile time what is required. Language conditionals are used when you don't know what you need until runtime.