Ответ 1
Для Mac OS:
#ifdef __APPLE__
Для MingW в Windows:
#ifdef __MINGW32__
Для Linux:
#ifdef __linux__
Для других компиляторов Windows проверьте этот поток и этот для нескольких других компиляторов и архитектур.
Я пишу кросс-платформенный код, который должен компилироваться в Linux, Windows, Mac OS. В окнах я должен поддерживать визуальную студию и mingw.
Есть несколько частей кода, специфичного для платформы, который я должен разместить в среде #ifdef .. #endif
. Например, здесь я разместил специальный код win32:
#ifdef WIN32
#include <windows.h>
#endif
Но как узнать Linux и Mac OS? Что определяет имена (или т.д.), Которые я должен использовать?
Для 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 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 напрямую.
Если вы пишете С++, я не могу рекомендовать использовать библиотеки Boost достаточно сильно.
В последней версии (1.55) есть новая библиотека Predef, которая охватывает именно то, что вы ищете, а также десятки других макросов распознавания платформы и архитектуры.
#include <boost/predef.h>
// ...
#if BOOST_OS_WINDOWS
#elif BOOST_OS_LINUX
#elif BOOST_OS_MACOS
#endif