""If you need them for some reason, build a wrapper around it."
Which brings us back to code with #ifdefs"
Indeed you will have a small number of #ifdefs in those libraries. So for example, your File API Wrapper might introduce 10 #ifdefs. There is indeed *some* effort related to that. But you certainly do not look daily at those #ifdefs, because you have debugged your wrappers once and they are realiable now.
You do *not* have #ifdefs scattered around your "main" body of code. Instead you will use the Wrapper classes at lots of places.
Regarding fork() - this is an issue because Windows/NT and all of its descendants do not have a proper replacement for that functionality, as far as I know. No way to inherit file handles and so on.
But the modern way of application architecture uses threads, anyway. So this example is a bit of odd.
If you start with a new software design you can normally limit yourself to using the subset of features you can reliably use on several operating systems, including windows/NT-type, POSIX and probably also zOS and VMS.
Porting a legay POSIX app to Windows is probably a bad idea, though.
And I also stick to the idea that windows/VS2008 is a great debugging platform and Linux should be used for valgrind and svn server.