与大多数日志记录框架一样,我们的日志记录框架使用__FUNCTION__预处理器宏将当前函数插入到日志文件中,以便我们的日志记录如下所示:
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
Run Code Online (Sandbox Code Playgroud)
当我们开始更多地使用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
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,所有类范围都已丢失,我们现在知道的是此日志语句来自匿名lambda.有没有人有一个很好的策略来退出封闭功能?这似乎是记录最有用的东西......
我认为唯一的解决方法是在封闭函数中扩展__FUNCTION__(或__func__在C++ 11中)并捕获lambda中的内容.
void f(){
auto& _func_ = __func__;
[&]{ std::cout << _func_; };
}
Run Code Online (Sandbox Code Playgroud)
不过,我会将此标记为"实施质量"问题.例如,GCC提供了__PRETTY_FUNCTION__对lambda(以及一般)扩展得更好的宏:
#include <iostream>
struct X{
void f(){
[]{ std::cout << __PRETTY_FUNCTION__ << "\n"; }();
}
};
int main(){
X().f();
}
Run Code Online (Sandbox Code Playgroud)
输出: X::f()::<lambda()>
| 归档时间: |
|
| 查看次数: |
1827 次 |
| 最近记录: |