在预处理指令中,##(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。