2015-12-08 14 views
5

C/C++コードを使用してオペレーティングシステムを自動検出する方法はありますか?私は、Linux、Windows、さらにはRaspberry Piでクロスプラットフォームコードを実行するために必要です。私はOSを自動検出しようとしているので、入力としてマシン上で実行されているOSを尋ねなければならない状況に置かれていません。C/C++でのOSの自動検出

私はファイルシステムの構造などを確認するようなハッキングを考えていましたが、私が何かに就いているかどうかはわかりません。

+0

これに対する答えは、実際にあなたがその差異で達成したいことに依存します。通常、正しいことはJeegar Patelのようにあらかじめ定義されたマクロを使用することですが、ビルドシステムでこれを検出し、適切なコンパイラなどを選択することもしばしば役に立ちます。 –

+1

POSIXシステムでは、クロスコンパイルなし)、ビルドコマンドで 'uname'を使うことができます –

+2

バイナリはいくつかの異なるオペレーティングシステム上で魔法のように実行され、実行時に実行時に検出されますか?とんでもない。私は、C++があなたの問題の間違った解決策であるかもしれないと考えています。 –

答えて

6

私はLinuxとWindows

#include<stdio.h> 

int main(int argc, char *argv[]) 
{ 

#ifdef _WIN32 
    printf("in Windows"); 
#endif 

#ifdef linux 
    printf("In Linux"); 
#endif 

    return 0; 
} 

あなたがこれをしているOSを検出するために、これらのマクロを使用する必要があるので、通常、すべてのツールチェーンが独自の定義済みマクロを持っている間にチェックするために、過去にコードの下に使用されてきました。

このような定義済みのマクロのリスト。

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


サイドノートとしてはい、ここではOSの検出は、コンパイル時のマクロを使用して起こっています。だから、ツールチェーンに応じて、それぞれのマクロの定義が構築されます。

Javaで、我々はC/Cで

System.getProperty("os.name") 

同じ方法を行うように、ランタイムにOSのバージョンを検出する++我々はすべてのAPIを持っていません。使用してPOSIXシステムでは


'uname' 我々は、OS名を取得することができます。

+0

これはOPが要求するとおり、自動検出ではありません。これは条件付きビルドです。 –

+0

@GeorgeAndré違いはどこですか? – fuz

+1

@FUZxxlここでは、コンパイル時、実行時にosを検出しています。 –

4

この便利なリストがあります(ディスクに保存してください!)。 predefined compiler macrosのリスト。

複数のプラットフォームをターゲットにしている場合は、既に利用可能なライブラリを探してください。

+1

BTW、[Qt](http://qt.io/)と[POCO](http:// pocoproject。org /)は、クロスプラットフォームのC++ライブラリです。 –