私の gcc (4.3.3) は、次の Linux 関連の定義済みマクロを定義しています:
$ gcc -dM -E - < /dev/null | grep -i linux
#define __linux 1
#define __linux__ 1
#define __gnu_linux__ 1
#define linux 1
VC++ (および他の多くの Win32 コンパイラ) では、プラットフォームを識別する定義済みのマクロがいくつかあります。最も顕著なのは _WIN32 です。詳細:http://msdn.microsoft.com/en-us/library/b0084kay(VS.80).aspx
これを行う標準的な方法はありません。プラットフォームごとに定義されている特定のマクロをキーオフできる場合があります。たとえば、Windows では _WIN32 が定義されますが、Linux ではほぼ確実に定義されません。ただし、対応する Linux マクロは知りません。
別々のコンパイラを使用しているため、別々のビルド環境があることになります。自分でマクロを追加してみませんか? Visual Studio と GCC はどちらもコマンド ラインからのマクロの定義をサポートしているため、マクロを定義するだけです。
私は常に、この方法でプラットフォームの詳細をメイン コードから除外しようとしています
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