Расшифровка препроцессорного оператора - PullRequest
0 голосов
/ 17 января 2011

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

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

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

Ответы [ 4 ]

4 голосов
/ 17 января 2011

Это известно как оператор вставки токена .

3 голосов
/ 17 января 2011

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

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

#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

1 голос
/ 17 января 2011

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

ALLOC(int, integer)

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

int  _integer;
int* integer = &_integer;
0 голосов
/ 17 января 2011

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

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

...