Главная » iPhone, Objective-C, Программирование для iOS и MacOS » Директивы  препроцессора Objective-C

0

Компилирование файла с кодом С, С++ или Objective-C осуществляется за два прохода. Сначала файл обрабатывается препроцессором, после чего результат обработки передается компилятору. Директивы препроцессора начинаются с символа

#; три наиболее часто используемых директивы – #include, #import и #define.

#include и #import

Директивы #include и #import делают практически одно и то же: они приказывают препроцессору прочитать файл и включить его в выходные данные. Обычно они используются для включения файлов объявлений (с расширением .h); объявления нужны компилятору для более полного понимания компилируемого кода.

Чем #include отличается от #import? Директива #import гарантирует, что

препроцессор включит файл только один раз. Директива #include позволяет многократно включить один файл. Программисты С чаще используют #inc1ude, а программисты Objective-C предпочитают #import.

Имя импортируемого файла может быть заключено в кавычки или угловые скобки. Кавычки означают, что заголовочный файл находится в каталоге проекта. Угловые скобки означают, что заголовочный файл находится в одном из стандартных каталогов, известных препроцессору. (Например, <math.h> находится в каталоге / Developer/SDKs/MacOSX10.7.sdk/usr/include/math.h.) Два примера директивы #import:

// Включение заголовков, написанных мной для операций Pet Store

#import "PetStore.h"

// Включение заголовкок для библиотек OpenLDAP

#import <ldap.h>

Когда-то в проектах каждый файл С программным кодом начинался с включения набора заголовков. Это приводило к загромождению начала файла и замедлению компиляции. Чтобы программисту было проще работать, а программы быстрее компилировались, в большинстве проектов Xcode имеется файл с перечнем заголовков, которые должны быть предварительно откомпилированы и включены в каждый файл. В проекте Constants этот файл называется Constants-Prefix.pch.

Итак, как же происходит включение константы из math.h во время компилирования main.m? Наш файл main.m содержит следующую строку:

#import <Foundation/Foundation.h>

Файл Fоundаtiоn.h содержит строку:

#include <CoreFoundation/CoreFoundation.h>

Файл СоreFоundаtiоn.h содержит строку:

#include <math.h>

#define

Директива #define приказывает препропессору: «Каждый раз, когда ты встречаешь Х, замени его на У еще до того, как компилятор увидит код». Еще раз взгляните на строку из math.h:

#define M_PI            3.14159265358979323846264338327950288

В директиве #define две части (символическое имя и его замена) разделяются пробелами.

Вообще говоря, с помощью директивы #define можно создать некое подобие

функции. Включите в main.m команду вывода большего из двух чисел:

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[])

{

@autoreleasepool {  NSLog(@"\u03c0 is %f", M_PI);

NSLog(@"%d is larger", MAX(10, 12));

}

return 0;

}

МАХ – не функция, а #define. Простейшая версия МАХ на языке С выглядит так;

#define MAX(A,B) ((A) > (B) ? (A) : (B))

Итак,  к  тому  моменту,  когда  компилятор  увидит  добавленную  строку,  она примет следующий вид:

NSLog(@"%d is larger", ((10) > (12) ? (10) : (12)));

Используя #define для имитации функций (вместо простой замены значений), вы создаете макроопределение, или макрос.

Источник: Аарон Хилегас, «Objective-C. Программирование для iOS и MacOS», 2012 г.

По теме:

  • Комментарии