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

Я пишу кросс-платформенный код, который должен компилироваться в Linux, Windows, Mac OS. В окнах я должен поддерживать визуальную студию и mingw.

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

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

Но как узнать Linux и Mac OS? Что определяет имена (или т.д.), Которые я должен использовать?

Ответ 1

Для Mac OS:

#ifdef __APPLE__

Для MingW в Windows:

#ifdef __MINGW32__

Для Linux:

#ifdef __linux__

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

Ответ 2

Смотрите: http://predef.sourceforge.net/index.php

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

Ответ 3

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

#ifdef _WIN32 // note the underscore: without it, it 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

РЕДАКТИРОВАТЬ: Хотя вышеизложенное может работать для основ, не забудьте проверить, какой макрос вы хотите проверить, посмотрев Справочные страницы Boost.Predef. Или просто используйте Boost.Predef напрямую.

Ответ 4

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

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

#include <boost/predef.h>

// ...

#if BOOST_OS_WINDOWS

#elif BOOST_OS_LINUX

#elif BOOST_OS_MACOS

#endif