Как определить платформу / компилятор из макросов препроцессора?

Я пишу кросс-платформенный код, который должен компилироваться в linux, windows, Mac OS. В windows я должен поддерживать visual studio и mingw.

есть некоторые части кода, специфичного для платформы, которые я должен поместить в #ifdef .. #endif окружающая среда. Например, здесь я разместил специфический код win32:

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

но как распознать linux и mac OS? Что определяет имена (или др. Я должен использовать?

4 ответов


на Mac OS:

#ifdef __APPLE__

на по MinGW на Windows:

#ifdef __MINGW32__

на Linux:

#ifdef __linux__

для других компиляторов Windows, проверьте этой теме и этой для нескольких других компиляторов и архитектур.


см.:http://predef.sourceforge.net/index.php

этот проект предоставляет достаточно полный список предопределенных #defines для многих операционных систем, компиляторов, стандартов языка и платформы и стандартных библиотек.


вот что я использую:

#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: хотя выше может работать для основ, не забудьте проверить, какой макрос вы хотите проверить, посмотрев на импульс.Predef справочные страницы. Или просто используйте Boost.Предопределенных напрямую.


Если вы пишете C++, я не могу рекомендовать использовать Boost библиотеки достаточно сильно.

последняя версия (1.55) включает в себя новый Predef библиотека, которая охватывает именно то, что вы ищете, наряду с десятками других макросов распознавания платформы и архитектуры.

#include <boost/predef.h>

// ...

#if BOOST_OS_WINDOWS

#elif BOOST_OS_LINUX

#elif BOOST_OS_MACOS

#endif