我正在阅读Caffe的源代码,我很好奇为什么caffe使用#define来创建像caffe.cpp这样的函数.
#define RegisterBrewFunction(func) \
namespace { \
class __Registerer_##func { \
public: /* NOLINT */ \
__Registerer_##func() { \
g_brew_map[#func] = &func; \
} \
}; \
__Registerer_##func g_registerer_##func; \
}
Run Code Online (Sandbox Code Playgroud)
他们使用RegisterBrewFunction来注册函数,必须有一些优点.他们可以使用if else来决定调用哪个函数,任何人都可以告诉我为什么以这种方式编写代码.
宏不只是创建一个函数; 它创建了一个类定义,该类的构造函数以及该类型的对象,所有这些都在匿名命名空间中.所有代码的作用是将用户定义函数的地址添加到函数func数据库中.虽然这是很多代码,但它的目的是让用户更容易注册函数.