Spec-Zone.ru › GCC 6

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

Spec-Zone.ru

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