私は常に、このようにすることで、プラットフォームの詳細をメインコードから除外しようとしています。
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
typedefし、ネイティブ呼び出しとして、またはあるプラットフォームから別のプラットフォームに設定された引数があまりにも異なる場合は、小さなラッパー関数を作成します。system_related_type
#define platform_SystemCall
特定のタスクのシステムAPIがプラットフォーム間で大きく異なる場合は、違いを分割する独自のバージョンAPIを作成する必要があります。ただし、ほとんどの場合、WindowsとLinuxのさまざまなAPI間にはかなり直接的なマッピングがあります。
プラットフォームを選択するために特定のコンパイラ#defineに依存するのではなく#define BUILD_PLATFORM xxx
、プロジェクトファイルまたはmakefileで、とにかくプラットフォームごとに一意である必要があるためです。