web-dev-qa-db-ja.com

プリプロセッサマクロからプラットフォーム/コンパイラを識別する方法

Linux、Windows、Mac OSでコンパイルするクロスプラットフォームコードを書いています。 Windowsでは、visual studioとmingwをサポートする必要があります。

プラットフォーム固有のコードがいくつかあり、#ifdef .. #endif環境に配置する必要があります。たとえば、ここにwin32固有のコードを配置しました。

#ifdef WIN32
#include <windows.h>
#endif

しかし、LinuxとMac OSをどのように認識するのでしょうか?定義名(またはその他)とは何ですか?

111
Arenim

Mac OSの場合:

#ifdef __Apple__

WindowsのMingWの場合:

#ifdef __MINGW32__

Linuxの場合:

#ifdef __linux__

他のWindowsコンパイラーについては、他のいくつかのコンパイラーおよびアーキテクチャーについて this thread および this を確認してください。

129
karlphillip

参照: http://predef.sourceforge.net/index.php

このプロジェクトは、多くのオペレーティングシステム、コンパイラ、言語とプラットフォームの標準、および標準ライブラリ用に事前定義された#definesのかなり包括的なリストを提供します。

59

私が使用するものは次のとおりです。

#ifdef _WIN32 // note the underscore: without it, it's not msdn official!
    // Windows (x64 and x86)
#Elif __unix__ // all unices, not all compilers
    // Unix
#Elif __linux__
    // linux
#Elif __Apple__
    // Mac OS, not sure if this is covered by __posix__ and/or __unix__ though...
#endif

EDIT:上記は基本的には機能する可能性がありますが、 Boost.Predef参照ページ 。または、Boost.Predefを直接使用します。

44
rubenvb

C++を作成している場合、 Boost ライブラリを十分に強く使用することはお勧めできません。

最新バージョン(1.55)には、新しい Predef ライブラリが含まれています。このライブラリは、 まさに探しているもの に加えて、他の多数のプラットフォームおよびアーキテクチャ認識マクロに対応しています。

#include <boost/predef.h>

// ...

#if BOOST_OS_WINDOWS

#Elif BOOST_OS_LINUX

#Elif BOOST_OS_MACOS

#endif
19
rvalue