They call it pre processor magic because it's difficult to maintain. Years ago, after writing an OR! Using C pre processor magic, I took a vow: Never again!
Do yourself a favor, either write clean, portable, clear and concise C code, or use a real pre-processor. The only time you should be using pre processor magic anyways is in a large project that's not a library anyways. So at that point it's pretty trivial to just use a proper pre-processor.