Я читал исходники кафе. В 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;
Надеюсь, кто-нибудь поможет мне об этом.
Ваш #define
определяет макрос, который можно использовать внутри функции. Когда код достигает этой функции, тогда аргумент макроса будет зарегистрирован. Вы должны вызвать функцию для приготовления кофе.
Оригинал #define
определяет макрос, который должен использоваться в области видимости файла. Это создает более или менее анонимный объект. Конструктор класса этого объекта будет запущен раньше main
вызывается и регистрирует функцию. Нет другой необходимой функции.
Поскольку назначение не может жить в глобальной области видимости, только внутри функции.
Этот макрос можно использовать во многих других местах, и, как правило, он обычно располагается в верхней части исходного файла, поэтому вам не нужно вызывать функцию, чтобы он работал.