Расшифровка препроцессорного оператора

Может ли кто-нибудь помочь мне расшифровать следующее заявление препроцессора.

#define ALLOC(x,y)     x _##y; x* y = &_##y;

Я знаю, что здесь делается некоторое выделение памяти для некоторой переменной y типа x. Но я не уверен, какова цель ## в приведенном выше заявлении. Было бы здорово, если бы кто-нибудь мог мне помочь.

4 ответа

Оператор вставки токена (##) используется, когда вам нужно сделать один токен из двух (или более) отдельных токенов.

без этого, т.е.

#define ALLOC(x,y) x _y; x* y = &_y;

ALLOC(a,b)

будет расширяться в:

a _y; a* b = &_y;

потому что препроцессор знает, что нужно заменить y на b, а _y - это совсем другой токен.

с оператором ## (т.е. ваш пример)

ALLOC(a,b)

будет расширяться в:

a _b; a* b = &_b;

## присоединяется к токену _ и знак b сформировать токен _b

Использование, такое как

ALLOC(int, integer)

создаст следующий код в месте вызова макроса:

int  _integer;
int* integer = &_integer;

Если я правильно помню, ## означает объединение "самих строк".

пример для вашего случая ALLOC(int,var2) == > int_var2; int* var2 = &_var2

Другие вопросы по тегам