Подтвердить что ты не робот

Какой макрос обернуть конкретный код 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 конкретным макросом?

4b9b3361

Ответ 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.