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, MacOS X) опция -fconstant-cfstrings, если также присутствует, переопределяет настройку -fconstant-string-class и приводит к тому, что литералы@"…"будут выложены как постоянные строки CoreFoundation. Обратите внимание, что -fconstant-cfstrings является псевдонимом для соответствующей опции -mconstant-cfstrings для целевой платформы. -
-fgnu-runtime -
Генерировать объектный код, совместимый со стандартной средой выполнения GNU Objective-C. Это значение по умолчанию для большинства типов систем.
-
-fnext-runtime -
Генерировать вывод, совместимый со средой выполнения NeXT. Это значение по умолчанию для систем на основе NeXT, включая Darwin и Mac OS X. Макрос
__NEXT_RUNTIME__предварительно определен, если (и только если) используется эта опция. -
-fno-nil-receivers -
Предполагать, что все диспетчеризации сообщений Objective-C (
[receiver message:arg]) в этом модуле трансляции гарантируют, что получатель не являетсяnil. Это позволяет использовать более эффективные точки входа в среду выполнения. Эта опция доступна только в сочетании со средой выполнения NeXT и версиями ABI 0 или 1. -
-fobjc-abi-version=n -
Использовать версию n Objective-C ABI для выбранной среды выполнения. Эта опция в настоящее время поддерживается только для среды выполнения 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вызываются непосредственно перед тем, как среда выполнения освобождает экземпляр объекта.На данный момент поддержка вызова методов
- (id) .cxx_constructи- (void) .cxx_destructдоступна только для среды выполнения NeXT на Mac OS X 10.4 и более поздних версиях. -
-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. Классовые методы и вызовы super никогда не проверяются на 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-13.3.0/gcc/Objective_002dC-and-Objective_002dC_002b_002b-Dialect-Options.html