The choice between 'portability' and 'ifdefs' is a false dichotomy. There are far cleaner ways to achieve portability, and ifdefs are almost always a sign of 'doing it wrong'.
See, for example, Kernighan and Pike talking about portability in The Practice of Programming.