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-
Используйте class-name в качестве имени класса для создания экземпляра каждого литерального строкового значения, указанного с помощью синтаксиса
@"…". По умолчанию используется имя классаNXConstantStringпри использовании GNU runtime иNSConstantStringпри использовании NeXT runtime (см. ниже). Если также присутствует опция -fconstant-cfstrings, она переопределяет настройку -fconstant-string-class и приводит к тому, что литералы@"…"будут представлены как константные строки CoreFoundation. -fgnu-runtime-
Генерировать объектный код, совместимый со стандартным GNU Objective-C runtime. Это значение по умолчанию для большинства типов систем.
-fnext-runtime-
Генерировать вывод, совместимый с NeXT runtime. Это значение по умолчанию для систем на базе NeXT, включая Darwin и Mac OS X. Макрос
__NEXT_RUNTIME__предварительно определен, если (и только если) используется эта опция. -fno-nil-receivers-
Предполагать, что все диспетчеризации сообщений Objective-C (
[receiver message:arg]) в этом блоке трансляции гарантируют, что получатель не являетсяnil. Это позволяет использовать более эффективные точки входа в runtime. Эта опция доступна только в сочетании с NeXT runtime и версиями ABI 0 или 1. -fobjc-abi-version=n-
Использовать версию n Objective-C ABI для выбранного runtime. В настоящее время эта опция поддерживается только для NeXT runtime. В этом случае версия 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 runtime — вызвать все такие методы в иерархии наследования объекта. Методы- (id) .cxx_constructвызываются runtime сразу после выделения нового экземпляра объекта; методы- (void) .cxx_destructвызываются непосредственно перед тем, как runtime удаляет экземпляр объекта.На данный момент только NeXT runtime на 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 runtime, так и с NeXT runtime (но недоступна в сочетании с NeXT runtime на Mac OS X 10.2 и ранее). -fobjc-gc-
Включить сборку мусора (GC) в программах Objective-C и Objective-C++. Эта опция доступна только с NeXT runtime; GNU runtime имеет другую реализацию сбора мусора, которая не требует специальных флагов компилятора.
-fobjc-nilcheck-
Для NeXT runtime с версией 2 ABI проверять наличие nil получателя в вызовах методов перед фактическим вызовом метода. Это значение по умолчанию и может быть отключено с помощью -fno-objc-nilcheck. Методы класса и вызовы суперкласса никогда не проверяются на nil таким образом, независимо от того, как установлен этот флаг. В настоящее время этот флаг не выполняет никаких действий при использовании GNU runtime или более старой версии NeXT runtime ABI.
-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 runtime на Mac OS X 10.3 и более поздних версиях. -fzero-link-
При компиляции для NeXT runtime компилятор обычно заменяет вызовы
objc_getClass("…")(когда имя класса известно на этапе компиляции) статическими ссылками на классы, которые инициализируются во время загрузки, что повышает производительность во время выполнения. Указание флага -fzero-link подавляет это поведение и заставляет вызовыobjc_getClass("…")сохраняться. Это полезно в режиме отладки Zero-Link, так как это позволяет изменять отдельные реализации классов во время выполнения программы. GNU runtime в настоящее время всегда сохраняет вызовыobjc_get_class("…")независимо от параметров командной строки. -fno-local-ivars-
По умолчанию переменные экземпляров в Objective-C могут быть доступны так, как если бы они были локальными переменными внутри методов класса, в котором они объявлены. Это может привести к затенению между переменными экземпляров и другими переменными, объявленными либо локально внутри метода класса, либо глобально с тем же именем. Указание флага -fno-local-ivars отключает это поведение, тем самым избегая проблем с затенением переменных.
-fivar-visibility=[public|protected|private|package]-
Установить видимость переменных экземпляра по умолчанию на указанную опцию, чтобы переменные экземпляров, объявленные вне области каких-либо директив модификатора доступа, по умолчанию имели указанную видимость.
-gen-decls-
Вывести объявления интерфейса для всех классов, увиденных в исходном файле, в файл с именем sourcename.decl.
-Wassign-intercept (Objective-C and Objective-C++ only)-
Выдавать предупреждение всякий раз, когда сборщик мусора перехватывает присваивание Objective-C.
-Wno-protocol (Objective-C and Objective-C++ only)-
Если класс объявлен как реализующий протокол, выдаётся предупреждение для каждого метода протокола, который не реализован в классе. По умолчанию выдаётся предупреждение для каждого метода, не реализованного явно в классе, даже если реализация метода унаследована от суперкласса. Если используется опция -Wno-protocol, то методы, унаследованные от суперкласса, считаются реализованными, и для них не выдаётся предупреждение.
-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, описывающий наибольшую структуру, передаваемую по значению, если таковая имеется.
Далее: Параметры форматирования сообщений об ошибках, Предыдущее: Опции диалекта C++, Вверх: Вызов GCC [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-9.5.0/gcc/Objective-C-and-Objective-C_002b_002b-Dialect-Options.html