GNU/Linux >> Linux の 問題 >  >> Linux

オペレーティング システムに基づく C++ での条件付きコンパイル

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


Linux
  1. Linuxオペレーティングシステムをデータベースのようにクエリします

  2. UbuntuオペレーティングシステムでApacheを構成する

  3. UbuntuオペレーティングシステムでMySQLサーバーを構成する

  1. Ubuntuオペレーティングシステムで再起動をスケジュールする

  2. URLを開くためにオペレーティングシステムを呼び出しますか?

  3. Python でオペレーティング システムを確認するにはどうすればよいですか?

  1. LinuxUbuntuオペレーティングシステムのSSHポートを変更します

  2. UbuntuオペレーティングシステムにIMAPforPHP7.1をインストールします

  3. Linux コンテナーおよび Linux ハイパーバイザーとは何ですか?