2017-03-06 49 views
2

我正在閱讀Caffe的源代碼,我很好奇caffe爲什麼使用#define來創建caffe.cpp中的函數。爲什麼caffe使用#define宏來創建函數

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

它們使用RegisterBrewFunction來註冊函數,必須有一些優點。他們可以使用其他方式來決定調用哪個函數,誰能告訴我爲什麼要用這種方式編寫代碼。

回答

5

該宏不只是創建一個函數;它創建一個類定義,該類的構造函數以及該類型的一個對象,全部在匿名命名空間中。所有代碼的作用是將用戶定義函數func的地址添加到函數數據庫。雖然這是很多代碼,但它的目的是讓用戶更容易註冊功能。

+0

因此,當我們收到參數時,爲什麼不只是使用if和else子句來決定調用哪個函數,爲什麼我們應該提前註冊這些函數。 –

+0

@zhichai - 因爲if/else幾乎要求你事先知道你可能想調用哪些函數。註冊點在於,當您構建代碼庫並添加函數時,您不必返回到if/else鏈並重寫它。 –

+0

謝謝,我想我有你。 –