Spec-Zone.ru › GCC 7

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 runtime, и NSConstantString если используется NeXT runtime (см. ниже). Параметр -fconstant-cfstrings, если он также присутствует, переопределяет значение -fconstant-string-class и приводит к тому, что строковые литералы @"…" будут выложены как постоянные строки CoreFoundation.

-fgnu-runtime

Генерировать объектный код, совместимый со стандартным GNU runtime для Objective-C. Это значение по умолчанию для большинства типов систем.

-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 это достигается с помощью страницы обмена (comm page).

-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. Классовые методы и вызовы super никогда не проверяются на nil таким образом, независимо от того, как установлен этот флаг. В настоящее время этот флаг не оказывает никакого влияния, когда используется GNU runtime или более старая версия ABI NeXT runtime.

-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

Вывести объявления интерфейса для всех классов, встречающихся в исходном файле, в файл с именем имя_исходного_файла.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 заголовок, описывающий самую большую структуру, передаваемую по значению, если таковая имеется.

END_OF_DOCUMENT_MARKER

Следующее: Параметры форматирования сообщений диагностики, Предыдущее: Параметры диалекта C++, Верхний уровень: Вызов GCC [Оглавление][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-7.5.0/gcc/Objective-C-and-Objective-C_002b_002b-Dialect-Options.html

Spec-Zone.ru

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