В строке замещения могут быть использованы операции # и ##.
Операция # помещается перед параметром. При макроподстановке аргумент, замещающий данный параметр, заключался в двойные кавычки.
Пример:
Если определен макрос
#define print(A) printf(#A“=%f”, А)
то макровызов
print (sin (a/2));
будет заменен оператором
printf (“sin(a/2)”“=%f”, sin (a/2));
Последовательность операторов
double а=3.14159;
print (sin (a/2));
выведет на экран текст
sin(a/2)=1.0
Операция ## помещается между двумя лексемами строки замещения, и осуществляет их конкатенацию (соединение).
Пример:
Определены три макроса с одинаковым списком параметров и одинаковыми аргументами. Отличает только строка замещения.
#define zero(a, b, с, d) a (bcd)
#define one(a, b, c, d) a (b с d)
#define two(a, b, c, d) a (b##c##d)
Макровызов: Результат макроподстановки:
zero(sin, x, +, у) sin(bсd)
one(sin, x, +, у) sin(x + у)
two(sin, x, +, y) sin(x+y)
В строке замещения макроса zero( ) последовательность “bсd” воспринимается как отдельный идентификатор. Замена символов b, с, d в составе идентификатора bсd аргуметами, соответствующими параметрам b, с, d не выполняется.
В строке замещения макроса one( ) символы b, с, d воспринимаются как три отдельных параметра, т.к. они отделены друг от друга пробелами. После макроподстановки пробелы сохраняются.
В строке замещения для макроса two( ) между параметрами b и с, с и d использована операция ##. Это позволяет после макроподстановки получить запись аргументов без пробелов между ними.