Zawsze staram się zachować specyfikę platformy z głównego kodu robiąc to w ten sposób
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
}
Teraz w windows_platform.h
i linux_platform.h
ty typedef system_related_type
na typ natywny i #define platform_SystemCall
jako połączenie natywne lub utwórz małą funkcję opakowania , jeśli argument ustawiony z jednej platformy na drugą jest zbyt inny.
Jeśli interfejsy API systemu dla określonego zadania znacznie różnią się między platformami, może być konieczne utworzenie własnego interfejsu API wersji, który dzieli różnicę. Ale w większości przypadków istnieją dość bezpośrednie odwzorowania między różnymi interfejsami API w systemach Windows i Linux.
Zamiast polegać na konkretnym kompilatorze #define, aby wybrać platformę, ja #define BUILD_PLATFORM w pliku projektu lub makefile, ponieważ i tak muszą one być unikalne dla platformy.
Jest haczyka gdy ma do czynienia z Win32/Win64 warunkowej kompilacji - podczas kompilacji dla Win64 można zauważyć, że _WIN32 definiuje więc próba przed _WIN64 przed przetestować (!) przeciwko _WIN32 –