2011-08-08 43 views
0

我看看我們如何使用Boost :: Extension BOOST_EXTENSION_TYPE_MAP_FUNCTION宏。Boost :: extension如何捲曲括號工作,如何自己製作這樣的宏?

例如像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定義。

我不知道這個宏是如何理解「花括號」中的內容以及如何將這個宏擴展爲某種類似「Hello擴展宏」的東西?

+2

宏不理解任何東西(?)它只是被替換 - 所以實際上(如果你忽略調用約定的東西)變成void void boost_extension_exported_type_map_function(boost :: extensions :: type_map&types)'(我已經省略了'extern「C」'位),即一個函數... – Nim

回答

4

讓我把我的意見變成一個答案......

宏是編譯器指令(我在這裏使用的總稱)的符號定義爲宏位置替代,例如

#define FOO 1 

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

(ps請不要用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; 
} 

它只是允許用戶定義自己的實現該功能......想必其他地方 - 它需要的地址該功能並通過指針使用它...