Расшифровка препроцессорного оператора
Может ли кто-нибудь помочь мне расшифровать следующее заявление препроцессора.
#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