Какие определения существуют как __LP64__ и __arm64__ в Cocoa, которые различают платформы во время компиляции? Где и как они определяются?

С введением arm64 в качестве стандартной архитектуры для платформы iphoneos в некоторых случаях необходимо реализовать условия компиляции для кода, специфичного для архитектуры 64/32.

Если вы посмотрите на CoreGraphics/CGBase.h и как некоторые популярные проекты с открытым исходным кодом обеспечивают поддержку arm64, ясно, что вы можете проверить наличие из 64-битного времени выполнения:

#if defined(__LP64__) && __LP64__
...
#else
...
#endif

Также можно специально проверить arm64 (в отличие от всего лишь 64-битной версии), как указано в это исправление для erikdoe/ocmock

#ifdef __arm64__
...
#else
....
#endif

Есть ли исчерпывающий список или документация для этих определений? Где или как они определены?

Ответ 1

Эти макросы не относятся к Cocoa, они специфичны для CLANG, и их можно указать в командной строке с помощью:

clang -dM -E -x c /dev/null

Различные версии CLANG поставляются с разным количеством флагов функций, которые могут включаться и выключаться во время конфигурации или в зависимости от того, на какой платформе и ОС работает компилятор. Достаточно полный список можно найти в заголовках тестирования с вариантами для каждой поддерживаемой системы, также разбросанными в каталоге тестирования. Документация для каждого зависит от того, является ли флаг конкретным для CLANG или определен в одной из стандартных библиотек, к которым он привязан (например, __llvm__ - определяемый CLANG, но __WCHAR_WIDTH__ определяется LibC). По этой причине действительно нет исчерпывающего списка с окончательной документацией. На разных платформах разрешено делать что-то несколько иначе, если они придерживаются спецификаций языка.

Большинство интересных общедоступных макросов Objective-C существуют в Foundation в нижней части Foundation/NSObjCRuntime.h.

Ответ 2

Вы можете найти этот список полезным.

Ссылка указывает точно на список архитектуры ifdef, здесь вы можете найти ссылки на другие списки (для обнаружения компилятора и платформы).