Чтение онлайн

на главную - закладки

Жанры

Программирование на Objective-C 2.0
Шрифт:

Отметим, что оператор «define имеет специальный синтаксис: для присваивания TRUE значения 1 не используется знак равенства. Кроме того, в конце оператора нет точки с запятой.

Операторы «define часто помещают ближе к началу программы, после операторов «import или «include, хотя они могут присутствовать в любом месте программы. Однако имя должно быть определено до того, как оно будет использовано. Определенные таким образом имена отличаются по своему поведению от переменных: не существует такого понятия, как локальный «define». После определения имени его можно использовать в любом месте программы.

Большинство программистов помещают операторы define в header-файлы (*.h), чтобы использовать их в нескольких исходных файлах.

В следующем примере напишем два метода для поиска площади и длины окружности объекта типа Circle. Поскольку в обоих методах требуется использовать константу, значение которой трудно запомнить, имеет смысл определить значение этой константы в начале программы и затем применять его в каждом методе.

Поэтому мы можем включить в программу следующую строку: #define PI 3.141592654

Теперь эту константу можно использовать в обоих методах класса Circle (в предположении, что класс Circle содержит переменную экземпляра с именем radius). -(double) area { return PI * radius * radius; } -(double) circumference { return 2.0 * PI * radius; }

Назначение константы для символического имени освобождает вас от необходимости помнить значение константы. Кроме того, если потребуется изменить значение этой константы, то это нужно будет сделать только в одном месте программы: в операторе #define. В противном вам придется выполнить поиск по всей программе и явно изменить значение константы.

Во всех приведенных примерах операторов define использовались прописные буквы (TRUE, FALSE и PI). Это было сделано, чтобы визуально отличить определенное значение от переменной. Некоторые программисты записывают все определенные имена прописными буквами, чтобы сразу различать, что перед ними: переменную, объект, имя класса или определенное имя. Перед определенным именем принято ставить букву к. В этом случае прописными буквами обозначаются не все символы, например, kMaximumValues и kSignificantDigits.

Применение определенного имени для значения константы упрощает расширение программы. Для массивов вместо конкретного указания размера массива, который нужно выделить в памяти, можно определить нужное значение: #define МAXIМUM_DATA_VALUES 1000

Теперь на этом определенном значении можно основывать все ссылки на размер массива (например, чтобы выделить место для этого массива в памяти) и допустимые индексные значения.

Кроме того, если профамма использует MAXIMUM DATA VALUES во всех случаях, где нужно указать размер массива, то чтобы изменить размер массива, достаточно изменить только это определение. Более сложные типы определений

Определение имени может включать не только простое константное значение. Это может быть и выражение и почти все, что можно предположить!

Ниже имя TW0_PI определяется как произведение 2.0 на 3.141592654: #define 7W0_PI 2.0 * 3.141592654

После этого определенное имя можно использовать в любом месте программы, где требуется выражение 2.0 * 3.141592654. Например, оператор return в методе circumference из предыдущего примера можно заменить оператором return TWO_PI * radius;

Если в профамме на Objective-C

встречается определенное имя, то все, что находится справа от этого определенного имени в операторе «define, подставляется вместо этого имени. Так, если препроцессор встречает имя TW0_PI в приведенном выше операторе return, он подставляет вместо этого имени то, что находится справа от этого имени в операторе «define, то есть 2.0 * 3.141592654.

Теперь вы понимаете, почему оператор #define нельзя закончить точкой с запятой. Если вы сделаете это, точка с запятой будет подставлена в том месте, где встретится соответствующее определенное имя. Если определить PI с помощью оператора #define PI 3.141592654;

и затем написать return 2.0 * PI * r;

препроцессор заменит этот экземпляр определенного имени PI на 3.141592654;.

Тогда после подстановки компилятору нужно будет обработать оператор return 2.0*3.141592654; * г;

что даст синтаксическую ошибку. Ставить точку с запятой после операторов define можно только в тех случаях, когда это действительно нужно.

Определение для препроцессора может не быть допустимым выражением Objective-C, но результирующее выражение в программе должно быть допусти мым. Например, вы можете задать определения: #define AND && #define OR ||

А затем писать такие выражения, как if ( х > 0 AND х < 10)

и if ( у == 0 OR у == value )

Можно даже использовать «define для оператора проверки равенства: #define EQUALS ==

И затем написать выражение if (у EQUALS 0 OR у EQUALS value )

Это позволяет избежать ошибки в тех случаях, когда для проверки равенства используют один знак равенства.

Возможности оператора «define велики, но практика надежного программирования не приветствует такие способы переопределения синтаксиса базового языка. Кроме того, это затрудняет другим людям понимание вашего кода.

Это еще не все. Поскольку определенное значение может ссылаться на другое определенное значение, следующие две строки «define допустимы. #define PI 3.141592654 #define TWO_PI 2.0 * PI

Имя TWO_PI определяется со ссылкой на предыдущее определенное ими PI, что избавляет от необходимости повторно писать значение 3.141592654.

Обратный порядок этих определений тоже допустим. #define TWO PI 2.0 * PI #define PI 3.141592654

Определенные значения можно использовать в определениях, если все, что нужно, определено на тот момент, когда соответствующее определенное имя используется в программе.

Разумное использование операторов #define позволяет сократить количество комментариев в программе. Рассмотрим оператор if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)

В выражении проверяется, високосный ли год записан в переменной year.

Рассмотрим оператор #define и оператор if. #define IS_LEAP_YEAR year % 4 == 0 && year % 100 != 0 \ ||year % 400 == 0 if (IS_LEAP_YEAR)

Обычно препроцессор предполагает, что определение целиком содержится в одной строке. Символом переноса строки (т.е. продолжения оператора) для препроцессора является обратный слэш. Этот символ игнорируется при подстановке. Если строк продолжения несколько, то каждая строка должна заканчиваться обратным слэшем.

Поделиться:
Популярные книги

Искатель 1

Шиленко Сергей
1. Валинор
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Искатель 1

Наследие Маозари

Панежин Евгений
1. Наследие Маозари
Фантастика:
рпг
попаданцы
аниме
5.80
рейтинг книги
Наследие Маозари

Потомок бога 3

Решетов Евгений Валерьевич
3. Локки
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Потомок бога 3

Лихие. Авторитет

Вязовский Алексей
3. Бригадир
Фантастика:
альтернативная история
попаданцы
5.00
рейтинг книги
Лихие. Авторитет

Двойник короля 11

Скабер Артемий
11. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Двойник короля 11

Я все еще не князь. Книга XV

Дрейк Сириус
15. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я все еще не князь. Книга XV

Я все еще не царь. Книга XXVI

Дрейк Сириус
26. Дорогой барон!
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Я все еще не царь. Книга XXVI

Светлая тьма. Советник

Шмаков Алексей Семенович
6. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Светлая тьма. Советник

Хозяин оков V

Матисов Павел
5. Хозяин Оков
Фантастика:
фэнтези
попаданцы
гаремник
5.00
рейтинг книги
Хозяин оков V

На границе империй. Том 7. Часть 5

INDIGO
11. Фортуна дама переменчивая
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 7. Часть 5

Вперед в прошлое 5

Ратманов Денис
5. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 5

Третий. Том 2

INDIGO
2. Отпуск
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий. Том 2

Двойник Короля

Скабер Артемий
1. Двойник Короля
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Двойник Короля

Компас желаний

Кас Маркус
8. Артефактор
Фантастика:
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Компас желаний