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



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


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



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



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



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

572   1  

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().

Comments

    Ничего не найдено.