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++ и Java. Этот параметр необходим для использования ключевых слов 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 проверяется наличие нулевого получателя в вызовах методов перед выполнением фактического вызова метода. Это значение по умолчанию и его можно отключить с помощью -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-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-6.5.0/gcc/Objective-C-and-Objective-C_002b_002b-Dialect-Options.html