|
|
Если в строке замены между двумя лексемами, одна из которых
представляет параметр макроопределения, появляется операция
##, то сама операция ## и окружающие ее обобщенные пробелы
удаляются. Таким образом, результат операции ## состоит в
конкатенации.
Пусть есть макроопределение,
#define inherit(basenum) public Pubbase ## basenum, \ private Privbase ## basenum
тогда макровызов
class D : inherit(1) { };
приведет к такому результату:
class D : public Pubbase1, Privbase1 { };
Макроопределение, которое в строке замены соседствует с ##, не подлежит подстановке, однако, результат конкатенации может использоваться для подстановки. Приведем пример. Пусть есть определения:
#define concat(a) a ## ball
#define base B
#define baseball sport
Тогда макровызов
concat(base)
даст в результате
sport
а вовсе не
Bball
| |