Язык программирования C

Скачать в pdf «Язык программирования C»


Операция препроцессора ## предоставляет возможность сцепить фактические аргументы в одну строку в процессе раскрытия макроса. Если параметр в подставляемом тексте находится рядом со знаком ##, этот параметр заменяется фактическим аргументом, сам знак ## и окружающие его пробелы удаляются, а результат снова анализируется препроцессором. Например, макрос paste сцепляет два своих аргумента:


#define paste(front, back) front ## back


Выражение paste (паше, 1) порождает идентификатор namel.


Правила использования вложенных знаков ## загадочны и малопонятны; подробности можно найти в приложении А.


Упражнение4.14. Определите макрос swap(t,x,y), который обменивает местами значения двух аргументов типа t. (Примените блочную структуру.)

4.11.3. Условное включение


Существует возможность управлять самой препроцессорной обработкой, используя условные директивы, которые выполняются по ходу этой обработки. Это делает возможным условное включение фрагментов кода в программу в зависимости от условий, выполняющихся в момент компиляции.


В директиве #if выполняется анализ целочисленного выражения (которое не должно содержать операцию sizeof, приведение типов и константы, определенные через enum). Если выражение не равно нулю, в программу включаются все последующие строки вплоть до директивы #endif, #elif или #else. (Директива препроцессора #elif аналогична оператору else if.) Выражение defined (имя) в директиве #if равно единице, если имя определено с помощью #def ine, и нулю в противном случае.


Например, чтобы обеспечить включение файла hdr. h в текст программы не более одного раза, его содержимое следует окружить следующими условными директивами:


#if !defined(HDR)


#define HDR


/* здесь находится содержимое файла hdr.h */


#endif


При первом включении hdr. h определяется имя HDR; при последующих включениях обнаруживается, что имя уже определено, и текст пропускается вплоть до #endif. Этот подход можно применить, чтобы избежать многократного включения набора связанных друг с другом файлов. Используя указанные директивы во всех файлах набора, можно смело включать в каждый файл все заголовочные модули, которые ему требуются, не думая о степени их взаимосвязанности.

Скачать в pdf «Язык программирования C»