PEHDOM
ИМХО для этого пишутся отдельные модули с идентичными интерфейсами которые подгружаються в зависимости от ОС. И все чисто и понятно.
Это теоретически. На практике же всё различается, вплоть до установки в систему, вплоть до хранения конфигурации программы, способов загрузки этой конфигурации в программу. А вывод результатов в какой-нибудь системе может требовать дополнительного специфичного форматирования, переводов. Ну вот пример различия - открытие файла на запись. В винде, например, в текстовом режиме будет ставиться \r\n в конце каждой строки, тогда как такой файл, рассматриваемый потом в лине, будет всё так же содержать эти \r, которых в лине быть не должно. То есть для унификации самого файла между системами в винде файл нужно уже по-другому открывать, чтобы там ничего лишнего не было в итоге. Если будешь всё в одной программе писать, то фактически это будут две отдельные программы, подгружаемые по своим условиям. Вроде так будет всё нормально, но стоит тебе внести изменение в одну программу (добавить фичу или исправить баг), специфичное для её операционной системы, как тут же это изменение запросто зацепит другую программу, потому что у них есть общие части. Общие части живут хорошо, пока не появится такой сюрприз в виде неожиданного бага, который в одной системе глючит вот так, а в другой системе глючит совсем по-другому. Получится, что в одной системе тебе надо эту общую часть одним образом отредактировать, а в другой системе - совсем другим.
Я с этим сталкивался на деле. Очень печально потом сидеть и разделять сначала всё, чтобы просто баг исправить один.
Бывало и так, что баг был только в одной из систем, а код, в котором он был обнаружен, был общим для обеих систем. В итоге и баг исправить надо было, и исправление бага ломало исправный код для другой системы. Как только стало повторяться это несколько раз, пришло понимание, что надо разделить коды. После этого стало всё нормально и разрабатывать стало можно по отдельности для разных систем. Потом просто фичу добавляешь и в одной системе её гоняешь, а для другой системы ничего не надо писать. Когда же коды для двух систем пишутся сразу, то и каждую фичу нужно обязательно для обеих систем подгонять. Это очень затратно по силам: одну фичу добавишь и устанешь, а потом делать уже ничего не хочется. Другое дело, когда можно по отдельности всё делать. Для винды вообще делать ничего не хочется, потому что куча времени уходит на борьбу с глюками винды.