我正在努力了解以下 #define 的确切功能。
#define REGISTER_CONTEXT( ContextType ) static const FContextRegistrar ContextRegistrar_##ContextType( ContextType::StaticClass() );
REGISTER_CONTEXT(UBlueprintContext);
据我所知,它向数组添加了 UClass ,以便其他函数可以使用它并进行迭代。但是
是什么ContextRegistrar _ ## ContextType
在这种情况下可以吗?有人可以给我一个提示吗? 这导致我在运行时崩溃,我找不到类似的东西。
这是相应的结构:
struct FContextRegistrar
{
static TArray<TSubclassOf<UBlueprintLibraryBase>>& GetTypes()
{
static TArray<TSubclassOf<UBlueprintLibraryBase>> Types;
return Types;
}
FContextRegistrar( TSubclassOf<UBlueprintLibraryBase> ClassType )
{
GetTypes().Add( ClassType );
}
};
答案 0 :(得分:1)
这是在宏中连接令牌的方法,请参见Concatenation。
因此,在您的情况下:程序中的REGISTER_CONTEXT(Bar)
将扩展为ContextRegistrar_Bar
作为宏的一部分。
答案 1 :(得分:1)
##是C和C ++预处理程序中的令牌粘贴运算符。您可以使用它创建新令牌。例如:
#define MACRO(x)x ## 1
此宏创建一个新的令牌,该令牌与其参数x相同,但附加了1。如果像MACRO(1)
那样调用它,则结果将是整数文字11,MACRO(a)
的结果将是a1,您可以将其用作变量,函数,类等的名称。
在您的示例中,REGISTER_CONTEXT(UBlueprintContext);
将产生以下代码:
static const FContextRegistrar ContextRegistrar_UBlueprintContext( UBlueprintContext::StaticClass() );