I have never worked with #if, #ifdef, #ifndef, #else, #elif and #endif
The use of the preprocessor directives in this case is not entirely useful. But the use of these preprocessor directives is useful in many other cases.
These preprocessor directives can be used for conditional compilation. e.g. If some program has to be developed for multiple platforms then platform-specific constants can be given values. Changing these values compilation specific to the platform can be done while the whole code can be maintained as one big entity.
These are also useful while debugging. Test units can be compiled into the code and ran by using these conditional compilations while debugging and they can be stopped from compiling using these.