Конкатенация макросов, генерация имени функции

#define Map(From, To, val)          \
        Map__##From__##To(val)


Map(TYPEA, TYPEB, 22);

В приведенном выше коде мне интересно, почему Map(TYPEA, TYPEB, 22); расширяется до Map__From__TYPEB(22);, а не Map__TYPEA__TYPEB(22);

Я использовал gcc -E для расширения.


person Kamath    schedule 20.03.2013    source источник


Ответы (2)


Поскольку From__ не является токеном в Map и, следовательно, препроцессор не ищет его. Исправление:

#define Map(From, To, val) \
        Map__##From##__##To(val)
person Aniket Inge    schedule 20.03.2013
comment
Это работает нормально, но я еще не понял причину, не могли бы вы указать мне какую-нибудь литературу, которая могла бы объяснить мне разницу между ##From## и ##From ? - person Kamath; 20.03.2013
comment
речь идет о понимании основного принципа @LOK, он прост - From - это токен, который можно заменить ... где From__ не является токеном, который можно заменить. Заменяемые токены указаны в скобках. - person Aniket Inge; 20.03.2013

"#define ZERO 0" != "#define ZERO 0_"

Точно так же в вашем фрагменте From != From_ и, следовательно, не заменяется. Рабочее решение уже предоставлено @Aniket.

person Abhineet    schedule 20.03.2013