Я всегда стараюсь не допускать особенностей платформы в основной код, делая это таким образом
platform.h:
#if BUILD_PLATFORM == WINDOWS_BUILD
#include "windows_platform.h"
#elif BUILD_PLATFORM == LINUX_BUILD
#include "linux_platform.h"
#else
#error UNSUPPORTED PLATFORM
#endif
someclass.c:
void SomeClass::SomeFunction()
{
system_related_type t;
// Other code
platform_SystemCall(&t);
// Other code
}
Теперь в windows_platform.h
и linux_platform.h
вы вводитеdef system_related_type
для собственного типа и либо #define platform_SystemCall
в качестве собственного вызова, либо создаете небольшую функцию-оболочку, если аргумент, установленный с одной платформы на другую слишком разные.
Если системные API для конкретной задачи сильно различаются между платформами, вам может потребоваться создать собственный API версии, который разделяет разницу. Но по большей части между различными API-интерфейсами в Windows и Linux существуют довольно прямые сопоставления.
Вместо того, чтобы полагаться на какой-то конкретный компилятор #define для выбора платформы, я #define BUILD_PLATFORM xxx
в файле проекта или make-файле, так как в любом случае они должны быть уникальными для платформы.