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 (см. ниже). Опция -fconstant-cfstrings, если также присутствует, переопределяет настройку -fconstant-string-class и приводит к тому, что литералы@"…"будут представлены в виде постоянных строк CoreFoundation. -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вызываются сразу перед тем, как среда выполнения освобождает экземпляр объекта.На данный момент только среда выполнения 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. Классовые методы и вызовы 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-11.4.0/gcc/Objective-C-and-Objective-C_002b_002b-Dialect-Options.html