Из других доступных программисту директив препроцессора чаще всего используется директива #define. За ней следует имя и значение; во время обработки исходного текста препроцессором имя в файле с кодом заменяется указанным значением.

Как хорошо пояснено в книге K&R (раздел 1.4), это отличный способ избежать жесткого кодирования “магических чисел” в вашей программе, которое затрудняет ее понимание и поддержку.

Например, в приложении iOS, в котором некоторые текстовые поля расположены одно над другим, я хочу добиться, чтобы промежутки между ними были одинакового размера. Пусть этот промежуток имеет размер, скажем, равный 3.0. Я не должен использовать в своем коде 3.0 непосредственно. Вместо этого я пишу

#define MIDSPACE 3.0

Теперь вместо “магического числа” 3.0 мой код использует значащее имя MIDSPACE; встречая в исходном тексте MIDSPACE, препроцессор заменяет его текстом 3.0. В качестве премии за использование имени, если я позже решу, что это значение должно быть иным, мне не придется менять каждое встреченное 3.0 в файле на другое значение — достаточно будет изменить только одну строку с соответствующей директивой #def ine.

Директива #def ine выполняет простую замену текста, так что в качестве значения может быть использовано любое выражение. Часто требуется, чтобы это выражение было литералом NSString. Дело вот в чем. В каркасе Cocoa литералы NSString могут использоваться как ключ в словаре или имя уведомления. (Пока пусть вас не волнует, что такое словарь или уведомление.) Эта ситуация — прямое приглашение сделать ошибку. Если у вас в словаре есть

ключ 0"mykey" и вы по ошибке где-то в коде введете его как @"туКеу" или 0"mikey", компилятор не будет жаловаться на это, но как положено программа работать не будет. Элегантным решением является определение имени для этого строкового литерала:

#define MYKEY S"mykey"

Теперь везде в своем коде вы используете MYKEY вместо @"mykey", и если ошибетесь (например, введете MYKKEY), то препроцессор не выполнит замену и компилятор сообщит об обнаруженной ошибке.

Директива #def ine может также использоваться для создания макроса (K&R 4.11.2), более сложного вида замены текста. При программировании для iOS вы встретитесь с некоторыми макросами Cocoa, но они будут казаться неотличимыми от функций; пусть их секрет пока остается нераскрытым, так как обычно макросы не касаются вас непосредственно.

Директива iwarning заставляет среду Xcode вывести предупреждение при компиляции; эта возможность может использоваться для напоминания самому себе о некоторой недоделанной задаче или требовании:

#warning Не забыть исправить этот участок кода

Имеется еще такая полезная в среде Xcode директива, как fpragma; о ней я расскажу, когда мы будем рассматривать среду программирования Xcode в главе 9.


 

 

 

Добавить комментарий


Защитный код
Обновить