15

我们的日志框架,像大多数日志框架一样,使用__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

随着我们开始更多地使用 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

如您所见,所有类范围都已丢失,我们现在只知道此日志记录语句来自匿名 lambda。有没有人有注销封闭功能的好策略?这似乎是最有用的记录...

4

1 回答 1

12

我认为唯一的解决方法是在封闭函数中扩展__FUNCTION__(或__func__在 C++11 中)并在 lambda 中捕获它。

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

不过,我会将其标记为“实施质量”问题。例如,GCC 提供了__PRETTY_FUNCTION__可以更好地扩展 lambdas 的宏(并且通常):

#include <iostream>

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

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

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

活生生的例子。

于 2012-10-04T13:35:33.727 回答