Ce n'est pas conseillé car ça crée du code spaghetti, tout simplement.
Mais il y a des fois (typiquement pour la portabilité) où c'est quand même nécessaire. Dans ce cas, le meilleur conseil à donner est d'isoler au maximum le code dépendant plate-forme dans un ou quelques modules, encapsulant ainsi la gestion de la portabilité. Et le reste du code ne contient pas un seul #ifdef, et se contente de se reposer sur les modules gérant la portabilité.