1

Windows と Linux で C++ コードの 1 つのコピーをコンパイルして実行したいと考えています。そのため、条件付きコンパイル (CC) を使用する必要があります。ただし、大量のコード ファイルで CC を使用するにはどうすればよいかという問題に遭遇します。

など、私は持っています:

//A.cpp
#define _WINDOWS_
#ifdef _WINDOWS_
#include <windows.h>
//some code for windows
#else
#include <pthread.h>
//some code for linux
#endif

私はB.cpp、C.cppも持っています...

すべてのファイルに「#define _WINDOWS_」を書くべきですか、それとももっと良い方法がありますか?

そして、私はこのようにしようとしました:

  1. ヘッド ファイル Platform.h を作成します。

     #ifndef _PLAT_
     #define _PLAT_
     #define _WINDOWS_
     #endif
    
  2. 次のように、Platform.h ファイルをインクルードします。

     //A.cpp
     #include "Platform.h"
     #ifdef _WINDOWS_
     #include <windows.h>
     //some code for windows
     #else
     #include <pthread.h>
     //some code for linux
     #endif
    
  3. エラーでコンパイルされます!含める"Platform.h"前に含める<windows.h>と、エラーが発生する可能性があります。

4

2 に答える 2

2

コンパイラから定義済みのマクロを使用します。

http://sourceforge.net/p/predef/wiki/OperatingSystems/

#ifdef _WIN32
// Code specific to Windows.
#elif defined __linux__ // Many variants; check the link above.
// Code specific to Linux.
#else
// Portable code.
#endif

これは、ほとんどの場合に機能します。

これらのマクロのほとんどは、ホストオペレーティング システム (つまり、プログラムをビルドしているシステム) を検出するために使用され、ターゲットオペレーティング システム (結果のプログラムが実行される予定のシステム) を検出するために使用されないことに注意してください。ただし、通常、両方のシステムが一致する場合があります。また、これらのマクロのいずれかが実際に事前定義されているかどうかは、明らかに特定のコンパイラに依存することに注意してください。

他のすべてが失敗した場合 (たとえば、ターゲットシステムがホストと異なる場合、またはコンパイラがシステム検出マクロを事前定義しないほど奇妙である場合)、コンパイラのコマンドラインでそれらのいずれかを定義するだけです (たとえば、-DPOSIX-準拠の C コンパイラ) をビルド スクリプトまたは makefile に追加します。#defineそのようなs をヘッダー自体に記述しないでください。

于 2013-01-08T03:56:53.257 に答える
0

コンパイル中に -D_WINDOWS_ を使用できます。(3) の場合、ヘッダーは順序付けに敏感であることに注意してください。

于 2013-01-08T03:43:54.870 に答える