Как определить платформу / компилятор из макросов препроцессора? - PullRequest
111 голосов
/ 05 января 2011

Я пишу кроссплатформенный код, который должен компилироваться в Linux, Windows, Mac OS.В Windows я должен поддерживать Visual Studio и Mingw.

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

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

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

Ответы [ 4 ]

129 голосов
/ 05 января 2011

Для Mac OS :

#ifdef __APPLE__

Для MingW в Windows:

#ifdef __MINGW32__

Для Linux :

#ifdef __linux__

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

59 голосов
/ 05 января 2011

См .: http://predef.sourceforge.net/index.php

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

44 голосов
/ 05 января 2011

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

#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

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

19 голосов
/ 06 декабря 2013

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

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

#include <boost/predef.h>

// ...

#if BOOST_OS_WINDOWS

#elif BOOST_OS_LINUX

#elif BOOST_OS_MACOS

#endif
...