Какой макрос обернуть конкретный код Mac OS X в C/С++
При чтении различных источников C и С++ я столкнулся с двумя макросами __APPLE__
и __OSX__
. Я нашел много использования __OSX__
в различных кодах, особенно тех, которые происходят из систем *BSD
.
Однако иногда я нахожу, что тестирование __OSX__
только недостаточно, и я должен завершить тесты с помощью макроса __APPLE__
.
Руководство по переносу командной строки Unix Tools в Mac OS X содержит __APPLE__
и дополнительно __APPLE_CC__
, но не упомянуть __OSX__
.
Руководство по переносу из GCC:
- Используйте
#ifdef __GNUC__
для переноса любого кода, специфичного для GCC. - Используйте
#ifdef __APPLE_CC__
для переноса любого кода, специфичного для Mac OS X.
Опять не упоминается макрос __OSX__
.
Какой макрос предопределен для платформы Mac OS X и среды разработки XCode, которая должна использоваться для различения кода, специфичного для OSX, в программах на C/С++?
Где определяется макрос __OSX__
? Является ли это *BSD
конкретным макросом?
Ответы
Ответ 1
Все зависит.
Каждый макрос определяет что-то другое по значению.
Смотрите: https://developer.apple.com/library/mac/documentation/Porting/Conceptual/PortingUnix/compiling/compiling.html#//apple_ref/doc/uid/TP40002850-SW13
__APPLE__
Этот макрос определен на любом компьютере Apple.
__APPLE_CC__
Для этого макроса задано целое число, представляющее номер версии компилятор. Это позволяет различать, например, компиляторы основанный на той же версии GCC, но с различными исправлениями ошибок или функциями. Большие значения обозначают более поздние компиляторы.
__OSX__
Предположительно, ОС является конкретным вариантом OS X
Поэтому, учитывая приведенные выше определения, я бы использовал __APPLE__
для различения кода, специфичного для яблока.
Ответ 2
Вот красивый список макросов для операционных систем.
В Интернете мало информации о __OSX__
. Вы будете в безопасности с __APPLE__
.
Ответ 3
Я обычно использую __MACH__
для этого. Он был определен с самой ранней версии OS X (и даже раньше, предположительно).
Ответ 4
См. http://nadeausoftware.com/articles/2012/01/c_c_tip_how_use_compiler_predefined_macros_detect_operating_system#OSXiOSandDarwin
#ifdef __APPLE__
#include <TargetConditionals.h>
#if TARGET_OS_MAC
...
#endif /* TARGET_OS_MAC */
#endif /* __APPLE__ */
Обратите внимание, что __OSX__
существует NOT, по крайней мере, с Xcode 9.
Также обратите внимание, что это #if TARGET_OS_MAC
not #ifdef
. Он всегда определен, но равен 0, если не macOS.
Ответ 5
Используйте
#if defined(__APPLE__) && defined(__MACH__)
отличить Apple MacOS (не iOS).
Относительно того, "откуда берется OSX ":
Некоторые онлайновые списки макросов компилятора (например, этот) __MACOSX__
. Некоторые комментарии на форуме (например, такие) утверждают, что __OSX__
существует. Это неверно. Нет таких макросов, предопределенных компиляторами OSX, но они могут быть определены специальными проектными файлами Makefile и сценариями определения платформы, такими как GNU autoconf.
Источник: http://nadeausoftware.com/articles/2012/01/c_c_tip_how_use_compiler_predefined_macros_detect_operating_system
Ответ 6
Для всех, кто сталкивался с этим вопросом> = 2019, я нашел там заголовок "Availability.h".
В этом заголовке есть #defines вроде:
#define __MAC_10_0 1000
#define __MAC_10_1 1010
#define __MAC_10_2 1020
#define __MAC_10_3 1030
#define __MAC_10_4 1040
#define __MAC_10_5 1050
#define __MAC_10_6 1060
#define __MAC_10_7 1070
#define __MAC_10_8 1080
#define __MAC_10_9 1090
#define __MAC_10_10 101000
#define __MAC_10_10_2 101002
#define __MAC_10_10_3 101003
#define __MAC_10_11 101100
#define __MAC_10_11_2 101102
Таким образом, вы МОЖЕТЕ сказать, компилируете ли вы на определенной платформе MacOS.