Директива препроцессора с хешем

#define f(g,g2) g##g2
main()
{
int var12=100;
printf("%d",f(var,12));
}

Этот код дает результат 100, но если препроцессор реализован, printf будет переписан как:

printf("%d",var##12);

Тогда как пришел результат?


person Ceres111    schedule 24.05.2013    source источник
comment
Что вы подразумеваете под реализованным?   -  person Stefano Sanfilippo    schedule 24.05.2013


Ответы (2)


Двойной хеш ## — это вставка токена оператор препроцессора. printf будет переписано так:

printf("%d",var12); // No double-hash

Двойной цифровой знак или оператор «вставки токена» (##), который иногда называют оператором «слияния», используется как в объектно-подобных, так и в функционально-подобных макросах. Он позволяет объединять отдельные токены в один и поэтому не может быть первым или последним токеном в определении макроса.

person Sergey Kalinichenko    schedule 24.05.2013
comment
Используется ли этот оператор вставки токенов только в определении макросов или в другом месте программы? - person Ceres111; 24.05.2013
comment
@ Ceres111 Оператор вставки токена определяется препроцессором, поэтому он недействителен вне макросов. Вы можете использовать его как с функциональными, так и с объектными макросами, т.е. можно написать #define MYVAR var##12, а затем printf("%d",MYVAR); - person Sergey Kalinichenko; 24.05.2013

Потому что f(var, 12) заменено на var12, которое является именем переменной, которую вы объявили и присвоили в строке выше. Директива препроцессора ## объединяет два аргумента.

person Stefano Sanfilippo    schedule 24.05.2013