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



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



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



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


но как я узнаю linux и mac OS? То, что определяет имена (или т. д.) Я должен использовать?

690   4  

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

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

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

#include <boost/predef.h>

// ...

#if BOOST_OS_WINDOWS

#elif BOOST_OS_LINUX

#elif BOOST_OS_MACOS

#endif

Comments

    Ничего не найдено.