Что делает ## (двойной хеш) в директиве препроцессора?
#define DEFINE_STAT(Stat) \
struct FThreadSafeStaticStat<FStat_##Stat> StatPtr_##Stat;
Вышеприведенная строка взята из Unreal 4, и я знаю, что могу рассказать об этом на нереальных форумах, но я думаю, что это общий вопрос на С++, который требует, чтобы его спрашивали.
Я понимаю, что первая строка определяет макрос, однако я не очень разбираюсь в префабрикатах shenanigans на С++, и поэтому я потерялся там. Логика говорит мне, что обратная косая черта означает, что объявление продолжается на следующей строке.
FThreadSafeStaticStat немного похож на шаблон, но там # происходит там и синтаксис, который я никогда раньше не видел в С++
Может ли кто-нибудь сказать мне, что это значит? Я понимаю, что у вас может не быть доступа к Unreal 4, но это просто синтаксис, который я не понимаю.
Ответы
Ответ 1
##
является оператором препроцессора для конкатенации.
Так что если вы используете
DEFINE_STAT(foo)
в любом месте кода он заменяется на
struct FThreadSafeStaticStat<FStat_foo> StatPtr_foo;
до того, как ваш код скомпилирован.
Вот еще один пример из моего блога, чтобы объяснить это подробнее.
#include <stdio.h>
#define decode(s,t,u,m,p,e,d) m ## s ## u ## t
#define begin decode(a,n,i,m,a,t,e)
int begin()
{
printf("Stumped?\n");
}
Эта программа успешно скомпилируется и выполнится, и выдаст следующий вывод:
Stumped?
Когда препроцессор вызывается для этого кода,
begin
заменяется на decode(a,n,i,m,a,t,e)
decode(a,n,i,m,a,t,e)
заменяется на m ## a ## i ## n
m ## a ## i ## n
заменяется на main
Таким образом, begin()
фактически заменяется на main()
.