4: #define SWAP(T) \ 5: inline void Swapt T& a, T& b)\ 6: { T t = a; a = b; b = t; } 7: #endif
Все, что от вас требуется — придумать уникальное символическое имя для директив-сторожей. В данном случае оно образовано из имени файла, в котором точка заменена на подчеркивание и два подчеркивания добавлены в начале, таким образом parmswap.h превратилось в _PARMSWAP_H — это простой и удобный вариант. Если это имя еще не определено, то при проверке в строке 2 условие директивы #ifndef будет иметь значение "истина" и текст из файла parmswap.h будет включен; далее в строке 3 стоит определение этого имени. В строке 7 директива #endif закрывает условно компилируемый блок текста.
Следующий исходный файл, который попытается включить в себя этот текст, будет встречен той же сторожевой директивой #ifndef, значение которой на этот раз будет уже ложным; и компилятор, разрешая ссылки на имена, будет обращаться к таблице символов, где эти имена уже в действительности присутствуют. Такой прием следует последовательно применять ко всем вами создаваемым заголовкам.
Этот пример наглядно демонстрирует тот объем работы, которую препроцессор производит прежде, чем уйти со сцены и передать бразды правления компилятору.
Создание строк
Препроцессор предоставляет множество мелких услуг для достижения частных целей. Одна из них, до сих пор не упоминавшаяся — создание строк из текста. Символ # перед текстом служит для препроцессора сигналом, что текст следует преобразовать в строку ASCIIZ (текст в формате ASCII, оканчивающийся нулем).
Это не самая выдающаяся способность препроцессора, но она может быть в некоторых ситуациях полезна. Если вам потребуется преобразовать текст в строку в стиле С, просто поставьте перед ним знак фунта (#); примеры этого вы еще увидите впереди.
Директива #еггог
Директива fterror заставляет компилятор прервать свою работу. Ее можно использовать для остановки компиляции при обнаружении семантической ошибки. В листинге 4.2 приведен простой пример, демонстрирующий применение директивы fterror.