Подтвердить что ты не робот

Что делает ## (двойной хеш) в директиве препроцессора?

#define DEFINE_STAT(Stat) \
struct FThreadSafeStaticStat<FStat_##Stat> StatPtr_##Stat;

Вышеприведенная строка взята из Unreal 4, и я знаю, что могу рассказать об этом на нереальных форумах, но я думаю, что это общий вопрос на С++, который требует, чтобы его спрашивали.

Я понимаю, что первая строка определяет макрос, однако я не очень разбираюсь в префабрикатах shenanigans на С++, и поэтому я потерялся там. Логика говорит мне, что обратная косая черта означает, что объявление продолжается на следующей строке.

FThreadSafeStaticStat немного похож на шаблон, но там # происходит там и синтаксис, который я никогда раньше не видел в С++

Может ли кто-нибудь сказать мне, что это значит? Я понимаю, что у вас может не быть доступа к Unreal 4, но это просто синтаксис, который я не понимаю.

4b9b3361

Ответ 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().