2012-10-04 24 views
12

我們的日誌框架,最喜歡的日誌框架,採用__FUNCTION__預處理宏插入當前功能到日誌文件,以便我們的記錄是這樣的:當lambda內部有記錄函數名稱的好方法嗎?

L4 T11332 609661594 [PreProcessorFunctions::RegenerateLinkIDs] [ENTER] 
L4 T11332 609661594 [PreProcessorFunctions::RegenerateLinkIDs] [EXIT] 
L4 T11332 609661594 [ConfigMerger::ValidateConfigObject] [ENTER] 
L3 T11332 609661594 [ConfigMerger::ValidateConfigObject] Configuration Exists: 1 

正如我們已經開始使用C++ 11多個,我注意到labmdas產生精確又無益__FUNCTION__輸出:

L4 T9604 609661594 [`anonymous-namespace'::<lambda1>::operator()] Writing EMX config file: C:\windows\TEMP\CBE01448-32A2-493A-A9A1-2112F5709028\CA37BE5C-B398-4D61-980D-66B8E1E6D001\\EMXConfiguration.xml 
L4 T11332 609661594 [`anonymous-namespace'::<lambda3>::operator()] Writing Auditing config file: C:\windows\TEMP\CBE01448-32A2-493A-A9A1-2112F5709028\CA37BE5C-B398-4D61-980D-66B8E1E6D001\\Auditing.xml 
L4 T11960 609661594 [`anonymous-namespace'::<lambda2>::operator()] Writing UEM config file: C:\windows\TEMP\CBE01448-32A2-493A-A9A1-2112F5709028\CA37BE5C-B398-4D61-980D-66B8E1E6D001\\Configuration.xml 

正如你所看到的,所有的類範圍已丟失,所有我們現在知道的是,這個記錄聲明來自一個匿名拉姆達來了。有沒有人有一個好的策略來註銷封閉函數?這似乎是最有用的東西記錄...

+0

http://stackoverflow.com/questions/4434282/visual-c-equivalent-of-file-line-and-pretty-function什麼是__FUNCSIG__給lambdas? – BoBTFish

+0

哈哈,VS2012示出:'wmain :: ::運算符()' – Benj

+0

至少它示出了封閉函數... – Benj

回答

9

我認爲唯一的解決方法是擴大__FUNCTION__(或__func__在C + + 11)封閉函數並捕獲lambda內。

void f(){ 
    auto& _func_ = __func__; 
    [&]{ std::cout << _func_; }; 
} 

雖然我會將此標記爲「實施質量」問題。 GCC,例如,提供了__PRETTY_FUNCTION__宏擴展爲多lambda表達式更好(和一般):

#include <iostream> 

struct X{ 
    void f(){ 
    []{ std::cout << __PRETTY_FUNCTION__ << "\n"; }(); 
    } 
}; 

int main(){ 
    X().f(); 
} 

輸出:X::f()::<lambda()>

Live example.

+4

用於'__PRETTY_FUNCTION__'的+1,如果只有MSVC實現。 – Benj

相關問題