web-dev-qa-db-ja.com

コードがWindowsにコンパイルされているかどうかを判断するマクロはありますか?

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

36
batty

[編集:コンパイル時マクロを使用して、どの環境にいるかを判断することを想定しています。たぶん、あなたはLinuxまたはWindowsではなく何かの下でWineで実行しているかどうかを判断したいかもしれませんが、一般的に、コンパイラは特定の環境をターゲットにしており、それはWindows(DOS)またはそうではありませんが、めったにありません(決して?)両方。]

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

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

時々_WIN32__CYGWIN32__、または場合によっては単なるコンパイラインジケータ(_MSC_VER)。

(makefileから)ビルドする環境がわかっている場合は、通常#defineコマンドラインで、「g++ -D __WIN32__ yourfile.c "。

ここでもう少し情報

34
phord

コンパイル環境、ホスト環境、およびランタイム環境を検出するには、さまざまな方法があります。すべては正確に知りたいものに依存します。環境には3つの種類があります。

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

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

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

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

Visual Studioのドキュメントには、他にも多くのマクロが記載されています。

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

確認したい内容を正確に伝えると、より具体的な回答が得られる場合があります。

19
JesperE
% touch foo.C ; g++ -dM -E foo.C

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

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

15
Mr.Ree

このことは、Visual Studio 2012および他のcgwinのg ++​​コンパイラで動作します。切り取りと貼り付けを行いますが、これは一般に薄くなります。Windowsのオペレーションシステムを検出するだけです。数量化を適用するだけです。勝てない場合は* 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;    
}
4
Mat-e

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

詳細については、MSDNの情報をご覧ください。

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

4
user51241

MSVC++コンパイラ(windows.hではなく)はallビルド用に_WIN32を定義しているため、チェックするのに安全なマクロです。 MinGW gccコンパイラーも同様です。 Win32をターゲットとするクロスコンパイル環境shouldこれも設定します。

3
j_random_hacker

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

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

C#では、比較的単純です。 System.Environment.OSVersionを参照して、「プラットフォーム」の下を確認できます。

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

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

3
Jerry

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

2
jmucchiello

おそらく使用しているコンパイラに依存しますが、試してみてください:

#ifdef WIN32
...
#endif
1
Ates Goral

上記のようなマクロは、プログラムがWindowsマシンコンパイル済み(またはfor)であったかどうかを示します、not Windowsマシンでrunningの場合。

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

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

次のようなマクロを作成できます。

#define RUNNING_ON_WINDOWS ( ... some test )

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

if (RUNNING_ON_WINDOWS) {
  ... 
} else 
   printf("Windows Required\n");
1
Tim Post