Как определить платформу / компилятор из макросов препроцессора?
Я пишу кросс-платформенный код, который должен компилироваться в linux, windows, Mac OS. В windows я должен поддерживать visual studio и mingw.
есть некоторые части кода, специфичного для платформы, которые я должен поместить в #ifdef .. #endif
окружающая среда. Например, здесь я разместил специфический код win32:
#ifdef WIN32
#include <windows.h>
#endif
но как распознать linux и mac OS? Что определяет имена (или др. Я должен использовать?
4 ответов
см.: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