在预处理指令中,##(double hash)是做什么的?

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

上面的代码是从Unreal 4中获得的,我知道我可以在虚幻论坛上提出这个问题,但是我认为这是一个普通的C ++问题,值得在这里提出。

我明白第一行定义了一个macros,但是我不熟悉C ++中的预处理器恶意代码,所以我迷失在那里。 逻辑告诉我反斜杠意味着声明继续到下一行。

FThreadSafeStaticStat看起来有点像一个模板,但是里面还有#和我在C ++中从未见过的语法

有人能告诉我这是什么意思吗? 我知道您可能无法访问虚幻4,但这只是我不明白的语法。

##是串联的预处理运算符。

所以,如果你使用

DEFINE_STAT(foo)

在代码中的任何地方,它被replace

struct FThreadSafeStaticStat<FStat_foo> StatPtr_foo;

在你的代码被编译之前。

这里是我的一个博客post的另一个例子, 以进一步解释这一点。

 #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()被replace为decode(a,n,i,m,a,t,e)()
  • decode(a,n,i,m,a,t,e)()被replace为m ## a ## i ## n()
  • m ## a ## i ## n()被replace为main()

因此,有效地, begin()main()replace。