Я пишу кросс-платформенный код, который должен компилироваться в Linux, Windows, Mac OS. В Windows я должен поддерживать Visual Studio и Mingw.
Есть некоторые фрагменты кода для конкретной платформы, которые я должен поместить в #ifdef .. #endif
среду. Например, здесь я разместил специальный код для Win32:
#ifdef WIN32
#include <windows.h>
#endif
Но как распознать Linux и Mac OS? Какие имена определений (или т. Д.) Я должен использовать?
Ответы:
Для Mac OS :
Для MingW в Windows:
Для Linux :
Для других компиляторов для Windows, проверьте эту тему и это для нескольких других компиляторов и архитектуры.
источник
__APPLE__
разница между OSX и iOS?__APPLE__
установлен как для OS X, так и для iOS. Вы можете#include <TargetConditionals.h>
внутри#ifdef __APPLE__
, что затем дает вамTARGET_OS_IPHONE #define
.__MINGW64__
также доступно при использовании mingw64__MINGW64__
упоминается, подумайте_MSC_VER
о Windows / MSVC (который также можно использовать для проверки версии MSVC).См. Http://predef.sourceforge.net/index.php
Этот проект предоставляет достаточно полный список предварительно определенных
#defines
для многих операционных систем, компиляторов, стандартов языка и платформы, а также стандартных библиотек.источник
Вот что я использую:
РЕДАКТИРОВАТЬ: Хотя приведенное выше может работать для основ, не забудьте проверить, какой макрос вы хотите проверить, просмотрев справочные страницы Boost.Predef . Или просто используйте Boost.Predef напрямую.
источник
#if
спрашивают, определено ли, другие проверяют ценность.#elif defined(__unix__)
Я думаю, если бы было более последовательным и т. Д.Если вы пишете на C ++, я не могу рекомендовать достаточно сильно использовать библиотеки Boost .
Последняя версия (1.55) включает новую библиотеку Predef, которая охватывает именно то, что вы ищете , а также десятки других макросов распознавания платформ и архитектуры.
источник