caffe.cpp РегистрацияBrewFunction

Я читал исходники кафе. В caffe.cpp, который является источником tools / caffe, я сталкиваюсь со следующими кодами, которые меня озадачивают:

#define RegisterBrewFunction(func) \
namespace { \
class __Registerer_##func { \
public: /* NOLINT */ \
__Registerer_##func() { \
g_brew_map[#func] = &func; \
} \
}; \
__Registerer_##func g_registerer_##func; \
}

Насколько мне известно, этот макрос заменяет RegisterBrewFunction (func) анонимным классом, и единственное, что он сделал, это добавил <#func, &func> to g_brew_map.
Так почему бы просто не сделать это так?

#define RegisterBrewFunction(func) g_brew_map[#func]=&func;

Надеюсь, кто-нибудь поможет мне об этом.

1

Решение

Ваш #define определяет макрос, который можно использовать внутри функции. Когда код достигает этой функции, тогда аргумент макроса будет зарегистрирован. Вы должны вызвать функцию для приготовления кофе.

Оригинал #define определяет макрос, который должен использоваться в области видимости файла. Это создает более или менее анонимный объект. Конструктор класса этого объекта будет запущен раньше main вызывается и регистрирует функцию. Нет другой необходимой функции.

0

Другие решения

Поскольку назначение не может жить в глобальной области видимости, только внутри функции.

Этот макрос можно использовать во многих других местах, и, как правило, он обычно располагается в верхней части исходного файла, поэтому вам не нужно вызывать функцию, чтобы он работал.

0

По вопросам рекламы [email protected]