3.6 Параметры управления диалектами Objective-C и Objective-C++
(ПРИМЕЧАНИЕ: В данном руководстве не описаны сами языки Objective-C и Objective-C++. См. Стандарты языков, поддерживаемых GCC, для ссылок.)
В этом разделе описаны параметры командной строки, имеющие смысл только для программ на Objective-C и Objective-C++. Вы также можете использовать большинство параметров GNU компилятора, независимых от языка. Например, вы можете скомпилировать файл some_class.m следующим образом:
gcc -g -fgnu-runtime -O -c some_class.m
В этом примере, -fgnu-runtime является параметром, предназначенным только для программ на Objective-C и Objective-C++; вы можете использовать другие параметры с любым языком, поддерживаемым GCC.
Обратите внимание, что поскольку Objective-C является расширением языка C, компиляции Objective-C также могут использовать параметры, специфичные для C фронтенда (например, -Wtraditional). Аналогично, компиляции Objective-C++ могут использовать параметры, специфичные для C++ (например, -Wabi).
Ниже приведен список параметров, только для компиляции программ на Objective-C и Objective-C++:
-
-fconstant-string-class=class-name -
Используйте имя-класса в качестве имени класса для создания экземпляра для каждой строковой литералы, указанной с помощью синтаксиса
@"…". По умолчанию имя класса равноNXConstantStringпри использовании среды выполнения GNU иNSConstantStringпри использовании среды выполнения NeXT (см. ниже). На платформах Darwin / macOS опция -fconstant-cfstrings, если также присутствует, переопределяет настройку -fconstant-string-class и приводит к тому, что литералы@"…"будут выводиться как постоянные строки CoreFoundation. Обратите внимание, что -fconstant-cfstrings является псевдонимом для целеспецифического эквивалента -mconstant-cfstrings. -
-fgnu-runtime -
Генерировать объектный код, совместимый со стандартной средой выполнения GNU Objective-C. Это значение по умолчанию для большинства типов систем.
-
-fnext-runtime -
Генерировать выходные данные, совместимые со средой выполнения NeXT. Это значение по умолчанию для систем на основе NeXT, включая Darwin / macOS. Макрос
__NEXT_RUNTIME__предварительно определен, если (и только если) используется этот параметр. -
-fno-nil-receivers -
Предполагать, что все диспетчеризации сообщений Objective-C (
[receiver message:arg]) в этом блоке трансляции гарантируют, что получатель неnil. Это позволяет использовать более эффективные точки входа в среду выполнения. Этот параметр доступен только в сочетании со средой выполнения NeXT и версиями ABI 0 или 1. -
-fobjc-abi-version=n -
Использовать версию n ABI Objective-C для выбранной среды выполнения. Этот параметр в настоящее время поддерживается только для среды выполнения NeXT. В этом случае версия 0 — это традиционный (32-битный) ABI без поддержки свойств и других дополнений Objective-C 2.0. Версия 1 — это традиционный (32-битный) ABI с поддержкой свойств и других дополнений Objective-C 2.0. Версия 2 — это современный (64-битный) ABI. Если ничего не указано, по умолчанию используется версия 0 на 32-битных целевых машинах и версия 2 на 64-битных целевых машинах.
-
-fobjc-call-cxx-cdtors -
Для каждого класса Objective-C проверять, являются ли какие-либо его переменные экземпляра объектами C++ с нетривиальным конструктором по умолчанию. Если это так, сгенерировать специальный метод экземпляра
- (id) .cxx_construct, который выполняет нетривиальные конструкторы по умолчанию для всех таких переменных экземпляра в порядке следования, а затем возвращаетself. Аналогично, проверить, является ли какая-либо переменная экземпляра объектом C++ с нетривиальным деструктором, и если это так, сгенерировать специальный метод- (void) .cxx_destruct, который выполнит все такие деструкторы по умолчанию в обратном порядке.Методы
- (id) .cxx_constructи- (void) .cxx_destructтаким образом сгенерированы только для переменных экземпляров, объявленных в текущем классе Objective-C, а не тех, которые унаследованы от суперклассов. Ответственность среды выполнения Objective-C — вызвать все такие методы в иерархии наследования объекта. Методы- (id) .cxx_constructвызываются средой выполнения сразу после выделения нового экземпляра объекта; методы- (void) .cxx_destructвызываются сразу перед тем, как среда выполнения удалит экземпляр объекта.На данный момент только среда выполнения NeXT на Mac OS X 10.4 и более поздних версиях поддерживает вызов методов
- (id) .cxx_constructи- (void) .cxx_destruct. -
-fobjc-direct-dispatch -
Разрешить быстрые переходы к диспетчеру сообщений. На Darwin это достигается с помощью страницы обмена данными.
-
-fobjc-exceptions -
Включить синтаксическую поддержку обработки структурированных исключений в Objective-C, аналогичную той, что предлагается C++. Этот параметр необходим для использования ключевых слов Objective-C
@try,@throw,@catch,@finallyи@synchronized. Этот параметр доступен как со средой выполнения GNU, так и со средой выполнения NeXT (но недоступен в сочетании со средой выполнения NeXT на Mac OS X 10.2 и более ранних версиях). -
-fobjc-gc -
Включить сборку мусора (GC) в программах Objective-C и Objective-C++. Этот параметр доступен только со средой выполнения NeXT; среда выполнения GNU имеет реализацию сборки мусора, которая не требует специальных флагов компилятора.
-
-fobjc-nilcheck -
Для среды выполнения NeXT с версией 2 ABI проверять наличие nil-получателя при вызовах методов перед фактическим вызовом метода. Это значение по умолчанию и может быть отключено с помощью -fno-objc-nilcheck. Методы классов и вызовы суперкласса никогда не проверяются на nil таким образом, независимо от того, каким образом установлен этот флаг. В настоящее время этот флаг не выполняет никаких действий при использовании среды выполнения GNU или более ранней версии ABI среды выполнения NeXT.
-
-fobjc-std=objc1 -
Соответствовать синтаксису языка Objective-C 1.0, который распознается GCC 4.0. Это влияет только на дополнения Objective-C к языку C/C++; это не влияет на соответствие стандартам C/C++, которое регулируется отдельными флагами опций диалекта C/C++. Когда этот параметр используется с компилятором Objective-C или Objective-C++, любой синтаксис Objective-C, который не распознаётся GCC 4.0, отклоняется. Это полезно, если вам нужно убедиться, что ваш код Objective-C можно скомпилировать с более старыми версиями GCC.
-
-freplace-objc-classes -
Выводить специальную метку, инструктирующую
ld(1)не статически подключать в результируемый объектный файл и разрешитьdyld(1)загрузить его во время выполнения. Это используется в сочетании с режимом отладки Fix-and-Continue, где объектный файл, о котором идет речь, может быть повторно скомпилирован и динамически загружен в процессе выполнения программы без необходимости перезапуска самой программы. В настоящее время функция Fix-and-Continue доступна только в сочетании со средой выполнения NeXT на Mac OS X 10.3 и более поздних версиях. -
-fzero-link -
При компиляции для среды выполнения NeXT компилятор обычно заменяет вызовы
objc_getClass("…")(когда имя класса известно во время компиляции) статическими ссылками на классы, которые инициализируются во время загрузки, что улучшает производительность во время выполнения. Указание флага -fzero-link подавляет это поведение и вызывает сохранение вызововobjc_getClass("…"). Это полезно в режиме отладки Zero-Link, поскольку позволяет изменять отдельные реализации классов во время выполнения программы. Среда выполнения GNU в настоящее время всегда сохраняет вызовыobjc_get_class("…")независимо от командной строки. -
-fno-local-ivars -
По умолчанию переменные экземпляров в Objective-C можно обращаться к ним так, как если бы они были локальными переменными из методов класса, в котором они объявлены. Это может привести к конфликту затенения между переменными экземпляров и другими переменными, объявленными либо локально внутри метода класса, либо глобально с тем же именем. Указание флага -fno-local-ivars отключает это поведение, тем самым избегая проблем с затенением переменных.
-
-fivar-visibility=[public|protected|private|package] -
Установить видимость переменных экземпляра по умолчанию на указанный параметр, чтобы переменные экземпляров, объявленные вне области действия каких-либо директив модификатора доступа, по умолчанию имели указанную видимость.
-
-gen-decls -
Вывести объявления интерфейсов для всех классов, увиденных в исходном файле, в файл с именем имя-источника.decl.
-
-Wassign-intercept (Objective-C and Objective-C++ only) -
Выдавать предупреждение всякий раз, когда присваивание Objective-C перехватывается сборщиком мусора.
-
-Wno-property-assign-default (Objective-C and Objective-C++ only) -
Не выдавать предупреждение, если для свойства объекта Objective-C не указаны семантика присваивания.
-
-Wno-protocol (Objective-C and Objective-C++ only) -
Если класс объявлен для реализации протокола, выводится предупреждение для каждого метода протокола, который не реализован классом. По умолчанию выводится предупреждение для каждого метода, не реализованного явно в классе, даже если реализация метода унаследована от суперкласса. Если используется опция -Wno-protocol, то методы, унаследованные от суперкласса, считаются реализованными, и предупреждение для них не выводится.
-
-Wobjc-root-class (Objective-C and Objective-C++ only) -
Выдавать предупреждение, если интерфейс класса отсутствует суперкласс. Большинство классов наследуют от
NSObject(илиObject) например. При объявлении классов, предназначенных для того, чтобы быть базовыми классами, предупреждение можно подавить, пометив их интерфейсы как__attribute__((objc_root_class)). -
-Wselector (Objective-C and Objective-C++ only) -
Выдавать предупреждение, если во время компиляции обнаружено несколько методов разного типа для одного селектора. Проверка выполняется по списку методов на последнем этапе компиляции. Дополнительно выполняется проверка для каждого селектора, появившегося в выражении
@selector(…), и соответствующий метод для этого селектора был найден во время компиляции. Поскольку эти проверки сканируют таблицу методов только в конце компиляции, эти предупреждения не генерируются, если заключительный этап компиляции не достигнут, например, из-за ошибки во время компиляции или из-за использования опции -fsyntax-only. -
-Wstrict-selector-match (Objective-C and Objective-C++ only) -
Выдавать предупреждение, если обнаружено несколько методов с различными типами аргументов и/или возвращаемых значений для данного селектора при попытке отправки сообщения с этим селектором получателю типа
idилиClass. Когда этот флаг выключен (что является по умолчанию), компилятор опускает такие предупреждения, если любые обнаруженные различия ограничены типами, которые имеют одинаковый размер и выравнивание. -
-Wundeclared-selector (Objective-C and Objective-C++ only) -
Выдавать предупреждение, если выражение
@selector(…)со ссылкой на необъявленный селектор найдено. Селектор считается необъявленным, если ни один метод с таким именем не был объявлен до выражения@selector(…), ни явно в объявлении@interfaceили@protocol, ни неявно в разделе@implementation. Этот параметр всегда выполняет свои проверки, как только обнаружено выражение@selector(…), в то время как -Wselector выполняет свои проверки только на последнем этапе компиляции. Это также обеспечивает соответствие соглашению по кодированию, согласно которому методы и селекторы должны быть объявлены до использования. -
-print-objc-runtime-info -
Генерировать заголовок C, описывающий самую большую структуру, передаваемую по значению, если она есть.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-14.2.0/gcc/Objective_002dC-and-Objective_002dC_002b_002b-Dialect-Options.html