Curly Brackets如何在Boost :: extension中工作,如何自己制作这样的宏?

时间:2011-08-08 15:25:43

标签: c++ boost macros brackets boost-extension

我看看我们如何使用Boost :: Extension BOOST_EXTENSION_TYPE_MAP_FUNCTION宏。

例如this

BOOST_EXTENSION_TYPE_MAP_FUNCTION
{
    std::map<std::string, boost::extensions::factory<service> > &factories(types.get());
    factories["file_service"].set<file_service>();
}

BOOST_EXTENSION_TYPE_MAP_FUNCTION宏在extension.hpp中定义。

我想知道这个宏如何理解Curly Brackets中的内容以及例如如何将这个宏扩展为像“Hello extended macro”这样的东西?

1 个答案:

答案 0 :(得分:4)

让我把我的评论写成答案......

宏是指向编译器的指令(我在这里使用集合术语)在该位置替换定义为该宏的符号,例如

#define FOO 1

int val = FOO; // at this point, FOO is replaced with 1

(p.s。请不要在C ++中这样做)

现在,在你的情况下发生的事情是有一组符号(函数的签名)被定义为宏,所以发生的一切都是编译器将宏替换为符号,最终结果看起来(大致)是这样的:

void boost_extension_exported_type_map_function(boost::extensions::type_map& types)
{
    std::map<std::string, boost::extensions::factory<service> > &factories(types.get());
    factories["file_service"].set<file_service>();
}

您可以看到一个简单的功能。你也可以这样做(但除非你有充分的理由,否则不要这样做)

#define BOB void foo(std::string const& bar)

BOB
{
  std::cout << "HEllo: " << bar << std::endl;
}

它只是允许用户为该函数定义自己的实现...大概在其他地方 - 它接受该函数的地址并通过指针使用它...