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 в качестве имени класса, экземпляр которого создается для каждой строковой константы, заданной с помощью синтаксиса
@"…". Если используется GNU runtime, имя класса по умолчанию —NXConstantString, а если используется NeXT runtime —NSConstantString(см. ниже). На платформах Darwin / macOS параметр -fconstant-cfstrings, если он также указан, переопределяет значение -fconstant-string-class и приводит к тому, что константы@"…"представляются в виде строковых констант CoreFoundation. Обратите внимание, что -fconstant-cfstrings — это псевдоним соответствующего параметра целевой платформы -mconstant-cfstrings. -
-fgnu-runtime -
Создавать объектный код, совместимый со стандартной GNU runtime Objective-C. Для большинства типов систем этот параметр используется по умолчанию.
-
-fnext-runtime -
Создавать вывод, совместимый с NeXT runtime. Этот параметр используется по умолчанию для систем на базе NeXT, включая Darwin / macOS. Макрос
__NEXT_RUNTIME__предварительно определяется тогда и только тогда, когда используется этот параметр. -
-fno-nil-receivers -
Предполагать, что все диспетчеризации сообщений Objective-C (
[receiver message:arg]) в данной единице трансляции гарантируют, что получатель не являетсяnil. Это позволяет использовать более эффективные точки входа в runtime. Этот параметр доступен только в сочетании с NeXT runtime и версией ABI 0 или 1. -
-fobjc-abi-version=n -
Использовать версию n ABI Objective-C для выбранной 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, но не с унаследованными от суперклассов. Вызов всех таких методов в иерархии наследования объекта должен обеспечивать runtime Objective-C. Методы- (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.
-
-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 никогда не выполняется для методов класса и вызовов super, независимо от значения этого флага. В настоящее время этот флаг ничего не меняет при использовании 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 -
Сохранять объявления интерфейсов всех классов, встреченных в исходном файле, в файл с именем sourcename.decl.
-
-Wassign-intercept (Objective-C and Objective-C++ only) -
Выдавать предупреждение при перехвате сборщиком мусора присваивания в Objective-C.
-
-Wno-property-assign-default (Objective-C and Objective-C++ only) -
Не выдавать предупреждение, если для свойства объекта Objective-C не задана семантика assign.
-
-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-15.3.0/gcc/Objective_002dC-and-Objective_002dC_002b_002b-Dialect-Options.html