Оператор #define позволяет присваивать символические имена программным константам. Оператор препроцессора:
1 |
#define TRUE 1 |
определяет имя TRUE и делает его эквивалентным значению 1. Затем имя TRUE можно использовать в любом месте программы, где могла бы использоваться константа 1.
Там, где появляется это имя, препроцессор автоматически подставляет вместо него значение 1. Например, следующий оператор Objective-C использует определенное имя TRUE.
1 |
gameOver = TRUE; |
Этот оператор присваивает значение TRUE переменной gameOver. Вам не обязательно помнить, какое конкретное значение вы определили для TRUE. Приведенный выше оператор будет присваивать 1 переменной gameOver. Оператор препроцессора:
1 |
#define FALSE 0 |
определяет имя FALSE и делает его эквивалентным значению 0.
Например, оператор:
1 |
gameOver = FALSE; |
присваивает значение FALSE переменной gameOver, а оператор:
1 2 |
if(gameOver == FALSE) ... |
сравнивает значение gameOver с определенным значением FALSE.
Определенное таким образом имя не является переменной, поэтому вы не можете присвоить ему значение, если результатом подстановки значения не является переменная.
Если в программе используется определенное имя, препроцессор автоматически подставляет то, что представлено в правой части оператора #define.
Это аналогично операции поиска и замены в текстовом редакторе, в данном случае препроцессор заменяет все экземпляры определенного имени соответствующим текстом.
Отметим, что оператор #define имеет специальный синтаксис: для присваивания TRUE значения 1 не используется знак равенства. Кроме того, в конце оператора нет точки с запятой.
Операторы #define часто помещают ближе к началу программы, после операторов #import или #include, хотя они могут присутствовать в любом месте программы. Однако имя должно быть определено до того, как оно будет использовано.
Определенные таким образом имена отличаются по своему поведению от переменных: не существует такого понятия, как локальный <define>.
После определения имени его можно использовать в любом месте программы. Большинство программистов помещают операторы define в header-файлы(*.h), чтобы использовать их в нескольких исходных файлах.
В следующем примере напишем два метода для поиска площади и длины окружности объекта типа Circle. Поскольку в обоих методах требуется использовать константу, значение которой трудно запомнить, имеет смысл определить значение этой константы в начале программы и затем применять его в каждом методе.
Поэтому мы может включить в программу следующую строку:
1 |
#define PI 3.141502654 |
Теперь эту константу можно использовать в обоих методах класса Circle(в предположении, что класс Circle содержит переменную экземпляра с именем radius).
1 2 3 4 5 6 7 8 |
-(double) area { return PI * radius * radius; } -(double) circumference { return 2.0 * PI * radius; } |
Назначение константы для символического имени освобождает вас от необходимости помнить значение константы. Кроме того, если потребуется изменить значение этой константы, то это нужно будет сделать только в одном месте программы: в операторе #define. В противном вам придется выполнить поиск по всей программе и явно изменить значение константы.
Во всех приведенных примерах операторов define использовались прописные буквы (TRUE, FALSE и PI). Это было сделано, чтобы визуально отличить определенное значение от переменной. Некоторые программисты записывают определенное значение от переменной.
Некоторые программисты записывают все определенные имена прописными буквами, чтобы сразу различать, что перед ними: переменная, объект, имя класса или определенное имя.
Перед определенным именем приятно ставить букву k. В этом случае прописными буквами обозначаются не все символы, например, kMaximumValues и kSignificantDigits.
Применение определенного имени для значения константы упрощает расширение программы. Для массивов вместо конкретного указания размера массива, который нужно выделить в памяти, можно определить нужное значение:
1 |
#define MAXIMUM_DATA_VALUES 1000 |
Теперь на этом определенном значении можно основывать все ссылки на размер массива(например, чтобы выделить место для этого массива в памяти) и допустимые индексные значения.
Кроме того, если программа использует MAXIMUM_DATA_VALUES во всех случаях, где нужно указать размер массива, то чтобы изменить размер массива, достаточно изменить только это определение.