语法“ ContextRegistrar _ ## ContextType”的含义

时间:2019-02-27 09:24:46

标签: c++ macros unreal-engine4

我正在努力了解以下 #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 );
    }
};

2 个答案:

答案 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() );