Если макроопределение имеет формальные параметры, то над формальными параметрами в тексте_подстановки могут быть произведены следующие препроцессорные операции:
1)# преобразование строки
2)## преобразование лексем
Если # предшествует формальному параметру в макроопределении, то соответствующий фактический аргумент, передаваемый макрокомандой, будет заключаться в кавычки и считаться строковым литералом. Строковый литерал автоматически сцепляется с соседними литералами, от которых он отделяется только одним пробелом.
Пр. #define Message(x) Message
Box(#x “сообщение”);
Message (хорошее)
↓
Message Box (хорошее сообщение)
Операция ## позволяет объединить две лексемы в одну, поэтому знак операции не может задаваться перед первой лексемой и после последней.
Если формальному параметру в макроопределении предшествует ## или следует за ним, то он сначала заменяется фактическим аргументом. Если аргумент содержит макрокоманду, то она не обрабатывается. Затем лексемы сцепляются, а сам знак ## удаляется из текста программы. Результирующая лексема должна быть правильной.
Если получившаяся лексема является именем макроопределения, то выполняется обработка макрокоманды.
Пр. #define debug(x) printf(“VAR”
#x”=%d”, VAR ##x)
debug (3)
↓
printf(“VAR3=%d”, VAR 3);
Прагмы (специальные директивы).
# pragma последовательность символов
Пр. #pragma
auto_inline([on|off])
#pragma check_stack([on|off])
проверка на переполнение стека
#pragma Data_seg (“имя”,”атрибут”)
#pragma message (“сообщение”)
Пр. #if _M_IX86==500
#pragma message (“Pentium processor”)
#endif
ПР #pragma once
f1.h
#define
f2.h
#if !#defined(f2.h)
#include
“F2.h”
#endif
f2.h
#define
f1.h
#if !#defined(f1.h)
#include
“F1.h”
#endif
#pragma warning9disable:4507, once 4385, error:164)