Какой макрос для переноса специфичного для Mac OS X кода в C / C ++ - PullRequest
37 голосов
/ 30 января 2010

При чтении различных источников 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 / C ++?

Где определен макрос __OSX__? Это *BSD конкретный макрос?

Ответы [ 5 ]

23 голосов
/ 30 января 2010

Все зависит.

Каждый макрос задает что-то другое по значению.
См .: 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__

Предположительно, ОС является частным вариантом ОС X

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

11 голосов
/ 30 января 2010

Вот хороший список макросов для операционных систем.

В сети __OSX__ мало информации. Вы будете в безопасности с __APPLE__.

4 голосов
/ 30 января 2010

Я обычно использую __MACH__ для этого. Это было определено с самой ранней версии OS X (и даже раньше, предположительно).

1 голос
/ 26 июля 2018

Используйте

#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

1 голос
/ 05 октября 2017

См. 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__ существует НЕ существует, по крайней мере, на Xcode 9.

Также обратите внимание, что это #if TARGET_OS_MAC, а не #ifdef. Он всегда определяется, но равен 0, если не macOS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...