logo
volkov / C++ / Бьерн Страуструп-Справочное руководство по С++

R.16.3.2 Операция ##

Если в строке замены между двумя лексемами, одна из которых

представляет параметр макроопределения, появляется операция

##, то сама операция ## и окружающие ее обобщенные пробелы

удаляются. Таким образом, результат операции ## состоит в

конкатенации.

Пусть есть макроопределение,

#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