質問

コードがコンパイルされるオペレーティングシステムに基づいて異なる処理を行うには、コードが必要です。次のようなものを探しています:

#ifdef OSisWindows
// do Windows-specific stuff
#else
// do Unix-specific stuff
#endif

これを行う方法はありますか?同じことをするより良い方法はありますか?

役に立ちましたか?

解決

OS用の定義済みマクロ サイトにはチェックの非常に完全なリスト。それらのいくつかを、それらが見つかった場所へのリンクとともに以下に示します。

Windows

_WIN32     32ビットと64ビットの両方
_WIN64     64ビットのみ

Unix(Linux、* BSD、Mac OS X)

このチェックを使用する際の落とし穴については、関連する質問をご覧ください。

unix
__ unix
__ unix __

Mac OS X

__ APPLE __
__ MACH __

両方が定義されています。いずれかのチェックが機能するはずです。

Linux

__ linux __
linux 廃止(POSIX準拠ではありません)
__ linux 廃止(POSIX準拠ではありません)

FreeBSD

__ FreeBSD __

他のヒント

WindowsでGCCの定義を表示:

gcc -dM -E - <NUL:

Linuxの場合:

gcc -dM -E - </dev/null

MinGWの定義済みマクロ:

WIN32 _WIN32 __WIN32 __WIN32__ __MINGW32__ WINNT __WINNT __WINNT__ _X86_ i386 __i386

UNIXの場合:

unix __unix__ __unix

nadeausoftware およびラムダフェアリーの答え

#include <stdio.h>

/**
 * Determination a platform of an operation system
 * Fully supported supported only GNU GCC/G++, partially on Clang/LLVM
 */

#if defined(_WIN32)
    #define PLATFORM_NAME "windows" // Windows
#elif defined(_WIN64)
    #define PLATFORM_NAME "windows" // Windows
#elif defined(__CYGWIN__) && !defined(_WIN32)
    #define PLATFORM_NAME "windows" // Windows (Cygwin POSIX under Microsoft Window)
#elif defined(__ANDROID__)
    #define PLATFORM_NAME "android" // Android (implies Linux, so it must come first)
#elif defined(__linux__)
    #define PLATFORM_NAME "linux" // Debian, Ubuntu, Gentoo, Fedora, openSUSE, RedHat, Centos and other
#elif defined(__unix__) || defined(__APPLE__) && defined(__MACH__)
    #include <sys/param.h>
    #if defined(BSD)
        #define PLATFORM_NAME "bsd" // FreeBSD, NetBSD, OpenBSD, DragonFly BSD
    #endif
#elif defined(__hpux)
    #define PLATFORM_NAME "hp-ux" // HP-UX
#elif defined(_AIX)
    #define PLATFORM_NAME "aix" // IBM AIX
#elif defined(__APPLE__) && defined(__MACH__) // Apple OSX and iOS (Darwin)
    #include <TargetConditionals.h>
    #if TARGET_IPHONE_SIMULATOR == 1
        #define PLATFORM_NAME "ios" // Apple iOS
    #elif TARGET_OS_IPHONE == 1
        #define PLATFORM_NAME "ios" // Apple iOS
    #elif TARGET_OS_MAC == 1
        #define PLATFORM_NAME "osx" // Apple OSX
    #endif
#elif defined(__sun) && defined(__SVR4)
    #define PLATFORM_NAME "solaris" // Oracle Solaris, Open Indiana
#else
    #define PLATFORM_NAME NULL
#endif

// Return a name of platform, if determined, otherwise - an empty string
char *
get_platform_name() {
    return (PLATFORM_NAME == NULL) ? "" : PLATFORM_NAME;
}

int main(int argc, char *argv[]) {
    puts(get_platform_name());
    return 0;
}

GCCおよびclangでテスト済み:

  • Debian 8
  • Windows(MinGW)
  • Windows(Cygwin)

ほとんどの場合、特定の機能が存在するかどうかを確認することをお勧めします。例:関数 pipe()が存在するかどうか。

#ifdef _WIN32
// do something for windows like include <windows.h>
#elif defined __unix__
// do something for unix like include <unistd.h>
#elif defined __APPLE__
// do something for mac
#endif

Microsoft C / C ++コンパイラ(MSVC)の定義済みマクロは次の場所にあります:

  

https://docs.microsoft.com/en-us / cpp / preprocessor / predefined-macros

あなたが探していると思う:

  

_WIN32-コンパイルターゲットが32ビットARM、64ビットARM、x86、またはx64の場合、1として定義されます。それ以外の場合、未定義
  _WIN64-コンパイルターゲットが64ビットARMまたはx64の場合、1として定義されます。それ以外の場合、未定義。

gccコンパイラーの事前定義されたマクロは、次の場所にあります:

  

http://gcc.gnu.org/onlinedocs/cpp/Predefined -Macros.html

あなたが探していると思う:

  

__ GNUC__
  __GNUC_MINOR__
  __GNUC_PATCHLEVEL__

事前に定義された適切なコンパイラに対してGoogleを実行します。

C標準に従って設定される標準マクロはありません。一部のCコンパイラは、一部のプラットフォームで設定します(たとえば、Appleのパッチを適用したGCCは、AppleシステムおよびDarwinプラットフォームでコンパイルしていることを示すマクロを設定します)。プラットフォームやCコンパイラも何かを設定するかもしれませんが、一般的な方法はありません。

hayalciが言ったように、これらのマクロを何らかの形でビルドプロセスに設定するのが最善です。コードを変更することなく、ほとんどのコンパイラでマクロを簡単に定義できます。 -D MACRO をGCCに渡すことができます。つまり、

gcc -D Windows
gcc -D UNIX

そしてあなたのコードで:

#if defined(Windows)
// do some cool Windows stuff
#elif defined(UNIX)
// do some cool Unix stuff
#else
#    error Unsupported operating system
#endif

MinGWでは、 _WIN32 定義チェックが機能していません。解決策は次のとおりです。

#if defined(_WIN32) || defined(__CYGWIN__)
    // Windows (x86 or x64)
    // ...
#elif defined(__linux__)
    // Linux
    // ...
#elif defined(__APPLE__) && defined(__MACH__)
    // Mac OS
    // ...
#elif defined(unix) || defined(__unix__) || defined(__unix)
    // Unix like OS
    // ...
#else
    #error Unknown environment!
#endif

詳細については、 https://sourceforge.net/p/predef/をご覧ください。 wiki / OperatingSystems /

#define OSsymbol および #ifdef OSsymbol を使用します OSsymbolは、ターゲットOSを識別する #define 'ableシンボルです。

通常、選択したOSシンボルを定義する中央ヘッダーファイルをインクルードし、OS固有のインクルードおよびライブラリディレクトリを使用してコンパイルおよびビルドします。

開発環境を指定しませんでしたが、一般的なプラットフォームとOSのグローバル定義をコンパイラが提供していると確信しています。

http://en.wikibooks.org/wiki/C_Programming/Preprocessor

外部参照は申し訳ありませんが、あなたの質問に適していると思います:

C / C ++のヒント:コンパイラーの定義済みマクロを使用してオペレーティングシステムの種類を検出する方法

一部のコンパイラは、これに役立つ#definesを生成します。コンパイラのドキュメントを読んで、それらが何であるかを判断してください。 MSVC は、 __ WIN32 __ であるものを定義します< href = "https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html" rel = "nofollow noreferrer"> GCC には、 touch foo.hで表示できるものがあります。 gcc -dM foo.h

プリプロセッサディレクティブ 警告またはエラー として使用して、実行する必要のないコンパイル時にチェックできます。 このプログラムは、単にコンパイルするだけです。

#if defined(_WIN32) || defined(_WIN64) || defined(__WINDOWS__)
    #error Windows_OS
#elif defined(__linux__)
    #error Linux_OS
#elif defined(__APPLE__) && defined(__MACH__)
    #error Mach_OS
#elif defined(unix) || defined(__unix__) || defined(__unix)
    #error Unix_OS
#else
    #error Unknown_OS
#endif

#include <stdio.h>
int main(void)
{
    return 0;
}

ここで Haiku の定義が見つかりませんでした。完了するには、Haiku-osの定義は簡単です __ HAIKU __

Boost.Predef には、OSを含むターゲットプラットフォーム用のさまざまな定義済みマクロが含まれています。はい、boostはしばしばC ++ライブラリと考えられますが、これはCでも動作するプリプロセッサヘッダーです

  

このライブラリは、C、C ++、Objective C、およびObjective C ++の定義済みマクロまたは一般的に利用可能なヘッダーで定義されたマクロの収集可能な情報から、コンパイラ、アーキテクチャ、オペレーティングシステム、ライブラリ、およびその他のバージョン番号のセットを定義します。このライブラリのアイデアは、Boost Configライブラリを拡張して、サポートする機能定義よりも多くの一貫した情報を提供するという提案から生まれました。以下は、その簡単な提案の編集版です。

たとえば

#include <boost/predef.h>

#if defined(BOOST_OS_WINDOWS)
#elif defined(BOOST_OS_ANDROID)
#elif defined(BOOST_OS_LINUX)
#elif defined(BOOST_OS_BSD)
...
#endif

オペレーティングシステムを取得するために小さなライブラリを作成しました。 clib (Cパッケージマネージャー)を使用してインストールされるため、プロジェクトの依存関係として使用するのは非常に簡単です。

インストール

$ clib install abranhe/os.c

使用法

#include <stdio.h>
#include "os.h"

int main()
{
    printf("%s\n", operating_system());
    // macOS
    return 0;
}

使用しているオペレーティングシステムの名前を含む文字列( char * )を返します。このプロジェクトの詳細については、 Githubのドキュメント

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top