Программируя на Objective-C, вы постепенно разработаете для своих программ собственный набор макросов. Чтобы не вводить их в каждую новую программу, вы можете собрать все определения в один файл и включать свои макросы в программу с помощью оператора #import.
Эти файлы обычно имеют расширение имени .h и называются заголовочными (header) или включаемыми(include) файлами.
Предположим, что мы пишем набор программ для метрических преобразований. Нам нужно задать операторы #define для констант, которые требуются при выполнении этим преобразований.
Мы ввели эти определения в файл с именем metric.h. Чтобы использовать определения из файла metric.h, в программе достаточно ввести следующую директиву препроцессора:
1 |
#import "metric.h" |
Этот оператор должен появиться до ссылки на любые операторы #define, содержащиеся в файле metric.h. Обычно его помещают в начале исходного файла. Препроцессор ищет указанный файл в системе и копирует содержимое этого файла в то место программы, где находится оператор #import.
Таким образом, любые операторы из этого файла обрабатываются так, как если бы они были непосредственно введены в программу в этом месте.
Кавычки, в которые заключено имя файла, показывают препроцессору, что файл нужно искать в одном или нескольких файловых каталогах(папках). Обычно поиск начинается с каталога, содержащего исходный файл, но в Xcode можно указать конкретные места для поиска, изменив настройки проекта(Project Settings).
Если заключить имя файла в угловые скобки(< и >):
1 |
#import <Foundation/Foundation.h> |
то препроцессор будет искать include-файл только в специальном <системном> каталоге(или каталогах) header-файлов, но в текущем каталоге поиск выполняться не будет.
И в этом случае при работе в Xcode можно изменить каталоги, выбрав в меню Project -> Edit Project Settings(Изменить настройки проекта).
Покажем на примере конкретной программы, как работают include-файлы.
Введем шесть приведенных выше операторов #define в файл с именем metric.h. Затем введем и запустим программу 1.1.
Программа 1.1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
/* Пример использования оператора #import Примечание. В этой программе предполагается, что определения заданы в файле с именем metric.h */ #import <Foundation/Foundation.h> #import <metric.h> int main(int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; float liters, gallons; NSLog(@"*** Liters to Gallons ***"); NSLog(@" Enter the number of liters: "); scanf("%f", &liters); gallons = liters * QUARTS_PER_LITER / 4.0; NSLog(@"%g liters = %g gallons", liters,gallons); [pool drain]; return 0; } |
Вывод программы 1.1:
1 2 3 4 |
*** Liters to Gallons *** (Литры в галлоны) Enter the number of liters: (Введите количество литров) 60.75 60.75 liters = 16.0484 gallons. (60.75 литров = 16.0484 галлонов) |
В программе 1.1 используется только одно определенное значение (QUARTS_PER_LITER) из include-файла metric.h определения доступны в любой программе, где применяется соответствующий оператор #import.
Одним из наиболее важных преимуществ использования файла импорта является возможность централизовать все определения, что гарантирует использование в программах одного и того же значения.
Кроме того, ошибки в include-файле достаточно исправить только в одном месте, не изменяя все программы, использующие это значение. Любую программу, в которой используется неверное значение, достаточно перекомпилировать, не редактируя.
Другие системные include-файлы содержат объявления для различных функций, хранящихся в базовой системной библиотеке C. Например, файл limits.h содержит системно-зависимые значения, которые задают размеры символьных и целых типов данных.
Максимальный размер типа int определяется внутри этого файла именем INT_MAX, максимальный размер unsigned long int определяется с помощью ULING_MAX и так далее.
Файл float.h задает информацию о типах данных с плавающей точкой: FLT_MAX указывает максимальное число с плавающей точкой, а FLT_DIG — число десятичных цифр для точности типа float.
Файл string.h содержит объявления для библиотечных процедур копирования, сравнения и конкатенации, которые выполняют операции с символьными строками. Если вы работаете исключительно со строчными классами Foundation, то эти процедуры вам не потребуются.