Как надежно определить Mac OS X, iOS, Linux, Windows в препроцессоре C?

Если есть какой-то кросс-платформенный код C / C ++, который должен быть скомпилирован в Mac OS X, iOS, Linux, Windows, как я могу их достоверно обнаружить во время процесса препроцессора?

Существуют предопределенные macros, которые используются большинством компиляторов, здесь вы можете найти список. Предопределенные macros компилятора GCC можно найти здесь . Вот пример для gcc:

#ifdef _WIN32 //define something for Windows (32-bit and 64-bit, this part is common) #ifdef _WIN64 //define something for Windows (64-bit only) #else //define something for Windows (32-bit only) #endif #elif __APPLE__ #include "TargetConditionals.h" #if TARGET_IPHONE_SIMULATOR // iOS Simulator #elif TARGET_OS_IPHONE // iOS device #elif TARGET_OS_MAC // Other kinds of Mac OS #else # error "Unknown Apple platform" #endif #elif __linux__ // linux #elif __unix__ // all unices not caught above // Unix #elif defined(_POSIX_VERSION) // POSIX #else # error "Unknown compiler" #endif 

Определенные macros зависят от компилятора, который вы собираетесь использовать.

_WIN64 может быть вложен в _WIN32 потому что _WIN32 определяется при таргетинге на Windows, а не только на версию x86. Это предотвращает дублирование кода, если некоторые из них являются общими для обоих.

Как указывает Джейк, TARGET_IPHONE_SIMULATOR является подмножеством TARGET_OS_IPHONE.

Кроме того, TARGET_OS_IPHONE является подмножеством TARGET_OS_MAC.

Таким образом, лучший подход может быть:

 #ifdef _WIN64 //define something for Windows (64-bit) #elif _WIN32 //define something for Windows (32-bit) #elif __APPLE__ #include "TargetConditionals.h" #if TARGET_OS_IPHONE && TARGET_IPHONE_SIMULATOR // define something for simulator #elif TARGET_OS_IPHONE // define something for iphone #else #define TARGET_OS_OSX 1 // define something for OSX #endif #elif __linux // linux #elif __unix // all unices not caught above // Unix #elif __posix // POSIX #endif 

Вид ответного ответа: люди на этом сайте потратили время на создание таблиц макросов, определенных для каждой пары ОС / компилятора .

Например, вы можете видеть, что _WIN32 НЕ определен в Windows с Cygwin (POSIX), в то время как он определен для компиляции в Windows, Cygwin (не POSIX) и MinGW с каждым доступным компилятором (Clang, GNU, Intel и т. Д.). ).

Во всяком случае, я нашел таблицы довольно информативными и думал, что я поделюсь здесь.

  • Есть ли эквивалент Linux для файлов ресурсов Windows?
  • На каких платформах есть что-то, кроме 8-битного символа?
  • Каков наилучший способ найти домашний каталог пользователей в Java?
  • Как получить текущее время и дату на C ++?
  • Interesting Posts

    Как отделить начальную нагрузку от инкрементальных детей с Firebase?

    Извлечение нескольких разделов страниц из pdf

    Как проверить, закрыто ли соединение TcpClient?

    Включение экрана с приемника / службы

    Самостоятельная установка восточноазиатского языка. Как удалить азиатские языки из языковой панели?

    В чем разница между Serializable и Externalizable в Java?

    Метапрограммирование: отказ определения функции Определяет отдельную функцию

    Почему проверка равенства не выполняется с массивами

    Хороший эквивалент NumericUpDown в WPF?

    Могу ли я покрасить определенные слова в Документе Google с помощью Google Apps Script?

    Должен ли я поддерживать Unicode в паролях?

    Что вызовет открытие окна CMD после запуска окон?

    Должны ли мы @ Использовать реализацию метода интерфейса?

    Проверьте, содержит ли строка только буквы

    Не удалось прочитать InputStream из Java Process (Runtime.getRuntime (). Exec () или ProcessBuilder)

    Давайте будем гением компьютера.