【问题标题】:Is there are nice way of logging function names when inside a lambda?在 lambda 中是否有很好的方法来记录函数名称?
【发布时间】:2012-10-04 13:26:49
【问题描述】:

我们的日志框架,像大多数日志框架一样,使用 __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。有没有人有注销封闭功能的好策略?这似乎是最有用的记录...

【问题讨论】:

  • stackoverflow.com/questions/4434282/… __FUNCSIG__ 为 lambdas 提供了什么?
  • 哈哈,VS2012显示:wmain::&lt;lambda_1e128d225a05e0419a588b92f71b0e5a&gt;::operator ()
  • 至少它确实显示了封闭函数...
  • VS2012 也为 __FUNCTION__ 产生类似的输出,它更有帮助,因为至少它可以在日志中被操纵成有用的东西。

标签: c++ c++11


【解决方案1】:

我认为唯一的解决方法是在封闭函数中扩展 __FUNCTION__(或 C++11 中的 __func__)并在 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()::&lt;lambda()&gt;

Live example.

【讨论】:

  • 更好的是,[&amp;,func=__func__]() { cout &lt;&lt; func; } 是可能的。将额外的变量保存在 lambda 的父作用域中。
  • @jørgensen clang-tidy 对此并不满意。说它仍然扩展到呼叫操作员
  • 如果您声明constexpr const auto &amp;_func_ = __func__,您不必捕获它
猜你喜欢
  • 2017-08-28
  • 2013-07-09
  • 2010-09-15
  • 2012-10-19
  • 1970-01-01
  • 1970-01-01
  • 2021-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多