Spec-Zone.ru › GCC 14

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API