Значение синтаксиса "ContextRegistrar _ ## ContextType" - PullRequest
0 голосов
/ 27 февраля 2019

Я изо всех сил пытаюсь понять, что точно делает следующее # 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 голосов
/ 27 февраля 2019

## - оператор вставки токена в препроцессоре 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() );
0 голосов
/ 27 февраля 2019

Это способ объединения токенов в макросах, см. Конкатенация .

Таким образом, в вашем случае: REGISTER_CONTEXT(Bar) в вашей программе расширится до ContextRegistrar_Bar как частьмакро.

...