8

システムコールを含むクロスプラットフォーム関数をC++で記述したいと思います。コードがコンパイルされているオペレーティングシステムを判別するために、どの条件付きコンパイルフラグを確認できますか?Visual StudioとGCCを使用して、主にWindowsとLinuxに興味があります。

私はそれがこのように見えるべきだと思います:

void SomeClass::SomeFunction()
{
    // Other code

#ifdef LINUX
    LinuxSystemCall();
#endif

#ifdef WINDOWS
    WindowsSystemCall();
#endif

    // Other code
}
4

4 に答える 4

9

私の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

于 2009-05-24T22:09:27.897 に答える
8

これを行うための標準的な方法はありません。プラットフォームごとに定義されている特定のマクロをキーオフできる場合があります。たとえば、_WIN32はWindowsで定義され、ほぼ確実にLinuxでは定義されません。ただし、対応するLinuxマクロはわかりません。

別々のコンパイラを使用しているため、別々のビルド環境があることになります。自分でマクロを追加してみませんか?Visual StudioとGCCはどちらも、コマンドラインからのマクロの定義をサポートしているため、マクロを定義するだけです。

于 2009-05-24T22:10:08.690 に答える
7

私は常に、このようにすることで、プラットフォームの詳細をメインコードから除外しようとしています。

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.htypedefし、ネイティブ呼び出しとして、またはあるプラットフォームから別のプラットフォームに設定された引数があまりにも異なる場合は、小さなラッパー関数を作成します。system_related_type#define platform_SystemCall

特定のタスクのシステムAPIがプラットフォーム間で大きく異なる場合は、違いを分割する独自のバージョンAPIを作成する必要があります。ただし、ほとんどの場合、WindowsとLinuxのさまざまなAPI間にはかなり直接的なマッピングがあります。

プラットフォームを選択するために特定のコンパイラ#defineに依存するのではなく#define BUILD_PLATFORM xxx、プロジェクトファイルまたはmakefileで、とにかくプラットフォームごとに一意である必要があるためです。

于 2009-05-25T00:07:28.050 に答える
0

これが私が使っているものです。VisualStudio2008およびMinGWで動作します。

#ifdef __GNUC__
  #define LINUX
#else
  #define WINDOWS
#endif

#ifdef WINDOWS
  #include "stdafx.h"
#else
  #include <stdlib.h>
  #include <string.h>
  #include <stdio.h>
  #include <ctype.h>
  #include <assert.h>
  #include <malloc.h>
#endif  
于 2010-06-30T16:46:41.077 に答える