37

コンパイルしているOSがWindowsかどうかを確認したいと思います。それを確認するためにチェックできる簡単なマクロはありますか?

4

10 に答える 10

35

[編集: コンパイル時マクロを使用して、現在の環境を判断したいと考えています。Windows の代わりに Linux などで Wine を実行しているかどうかを判断したいかもしれませんが、一般的に、コンパイラは特定の環境を対象としており、それは Windows (DOS) であるか、そうでないかのどちらかですが、めったに (決して?) 両方。]

一部のコンパイラは、Windows ビルド環境を示すマクロを提供します。ただし、これらはコンパイラごとに異なり、ターゲット環境が Windows だけではない場合、Windows 上の同じコンパイラでも異なります。通常__WIN32__は ですが、常にではありません。

#if defined (__WIN32__)
  // Windows stuff
#endif

、、または単にコンパイラ インジケータ ( ) の場合もあり_WIN32ます。 __CYGWIN32___MSC_VER

ビルドする環境が (makefile から) わかっている場合は、通常、#define" " のようにコマンド ラインで を渡すことができますg++ -D __WIN32__ yourfile.c

もう少し詳しい情報はこちら

于 2009-01-10T02:39:48.953 に答える
23

コンパイル、ホスト、およびランタイム環境を検出するには、さまざまな方法があります。すべては、正確に何を知りたいかによって異なります。環境には、大きく分けて次の 3 つのタイプがあります。

  • Build : これは、プログラムがコンパイルされる環境です。
  • Host : これは、プログラムが実行されている環境です。
  • Target : コード生成ツール (コンパイラなど) の場合、生成されたコードが実行される場所です。

クロスコンパイルの場合、ビルド環境とホスト環境が完全に異なる可能性があり (これは、組み込みアプリケーションをビルドする場合は一般的ですが、デスクトップ/サーバー アプリをビルドする場合はあまり一般的ではありません)、通常、コンパイル済みのバイナリを使用したシステムで実行することはできません。それをコンパイルします。それ以外の場合、ホスト環境はビルド環境と互換性がある必要があります。たとえば、Vista で実行される XP でアプリケーションをビルドする場合などです。

C プリプロセッサ マクロを使用して、ホスト システムの詳細 (つまり、何を実行しているか) を通知することはできません。コードが何のためにコンパイルされたかを示すことしかできません。Windows の場合、最も重要なマクロは次の 2 つです。

  • _WIN32は、Win32 API が使用可能であることを示します。使用しているコンパイラはわかりません。実際、_WIN32 は、Cygwin の GCC と MinGW の GCC の両方を使用する場合に定義されます。したがって、Visual Studio でコンパイルされているかどうかを判断するために _WIN32 を使用しないでください。
  • _MSC_VERプログラムが Microsoft Visual C/C++ でコンパイルされていることを示します。よくほとんど。Visual C++ のドロップイン置換を意図した Intel の C++ コンパイラを使用する場合にも定義され_MSC_VERます

Visual Studio のドキュメントで説明されている他のマクロが多数あります。

使用している Windows の正確なバージョンを知りたい場合は、GetVersion() などのランタイム関数を使用する必要があります (他の回答で説明されています)。

確認したいことを正確に教えていただければ、より具体的な回答が得られる場合があります。

于 2009-01-10T09:18:36.030 に答える
16
% touch foo.C ; g++ -dM -E foo.C

[マシン固有の] g++ コンパイラによって自動的に定義されたすべてのマクロ (#define の) を一覧表示するという素晴らしい仕事をします。

Microsoftのコンパイラにも似たようなものがあるかもしれません...

于 2009-01-10T04:21:14.817 に答える
4

MSVC ++コンパイラ(ではないwindows.h)はすべての_WIN32ビルドを定義するため、チェックするのがより安全なマクロです。MinGWgccコンパイラも同様です。Win32を対象とするクロスコンパイル環境でも、これを設定する必要があります。

于 2009-01-10T07:28:48.637 に答える
4

これは、VisualStudio2012やその他のcgwinのg++コンパイラで機能します。それを切り取って貼り付けますが、これは一般的にそれが得るのと同じくらい薄いですそれがするすべてはウィンドウズopシステムを検出することです。定量化を適用するだけです。勝てない場合は、* inux:Dをお楽しみください

#include <string>
#include <iostream>
#include <fstream>
#include <cstdlib>
Using namespace std;


int main(){    
    char chCap;    int i = 0;
    const int MAX_BUFFER = 70; 
    char buffer[MAX_BUFFER];

    string cmd="ver";   
    FILE *stream = _popen(cmd.c_str(), "r");

    if (0 != stream){
        while (!feof(stream)){  
            //One way is here
            //chCap = fgetc(stream);
            //cout << chCap;
            //buffer[i++] = chCap;

            //This one seams better
            fgets(buffer, MAX_BUFFER, stream);      
        }
        _pclose(stream);
    }       
    cout << endl;
    cout << buffer << endl;

    //The op sys detection starts here
    string opSys(buffer);   //char array to string
    if("Microsoft" == opSys.substr(0,9)){
        cout << "You are in a Microsoft envornment " << endl;
    }
    system("pause");
    return 0;    
}
于 2012-11-19T07:17:36.287 に答える
4

MS Windows を対象としたコードを実行している場合は、GetVersion() または GetVersionEx() を呼び出して詳細を確認したり、実行している Windows のバリアントを特定したりできます。

詳細については、MSDN 情報を調べてください。

http://msdn.microsoft.com/en-us/library/ms724451(VS.85).aspx

于 2009-01-10T02:57:08.077 に答える
3

これまでに言及したリンクは、コンパイル時の情報を示しています。コンパイル時にこれらのコード セグメント内にフラグを設定できます。

ただし、あなたが求めているのは、「Windowsで実行するようにコンパイルされていますか?」ではなく、「どのバージョンのWindowsで実行していますか?」という行に沿っていると思います。それが正しい仮定であることを願っています。

C# では、比較的単純です。System.Environment.OSVersion を参照してから、「プラットフォーム」の下を見ることができます。

ただし、C++について質問しています。どのコンパイラを使用していますか? これは、オペレーティング システムのバージョンを確認する方法に大きな違いをもたらします。これは、この情報を取得するための単一の標準がないためです (私が見つけたものです)。

Visual C++ では、Google を使用して GetVersion/GetVersionEx に関する情報を検索します。どちらも、プログラムが実行されている Windows の現在のバージョンに関する情報を含む構造を提供します。

于 2009-01-10T02:53:45.493 に答える
2

実際、私は環境に行きます。getenv() は標準ライブラリ関数であるため、おそらく移植可能な唯一の方法です。秘訣は、どの変数がすべての OS に固有であるかを把握することです。Windows には、設定する必要がある ComSpec、appdata、Windir、systemroot、および systemdrive があります。WINDOWS または WINNT のパス変数を strstr にすることもできますが、それは正確ではない可能性があります。私は Linux シェル/Solaris/MacOS の専門家ではないので、他の誰かがそれらの OS に存在する「標準」環境変数を教えてくれるかもしれません。CygWin もいくつかの問題を引き起こす可能性があります。

于 2009-01-10T05:05:58.020 に答える
1

上記のようなマクロは、プログラムがWindows マシンで実行されているかどうかではなく、Windows マシンでコンパイルれたかどうかを示します。

完全にプラットフォームにとらわれないもの (つまり、ファイル ストリームを開く/読み取り/処理/書き込みのみを処理する) を作成する場合は、コンピューターが Windows を実行している場合に存在するはずのファイルを開くなどのテストを行う必要があります。あなたのプログラムが標準 stdio や math などのみを使用している場合、これが当てはまります。

それ以外の場合、コードに Windows 固有のシステム コールが含まれていると、他のプラットフォームでは実行できません。

次のようなマクロを記述できます。

#define RUNNING_ON_WINDOWS ( ... some test )

条件付きコンパイルには使用しないでください。つまり、

if (RUNNING_ON_WINDOWS) {
  ... 
} else 
   printf("Windows Required\n");
于 2009-01-10T02:49:48.467 に答える