c++ - 如何在 lambda 捕获中显式捕获宏?

标签 c++ lambda macros

<分区>

我有一个 lambda,我想打印定义 lambda 的函数的名称。如果我在 lambda 中使用 __FUNCTION__,它只会打印 operator(),这是合理的,因为这是宏所在的函数。

但是,Clang-Tidy 对此发出警告并提到以下内容:

Clang-Tidy: Inside a lambda, '__FUNCTION__' expands to the name of the function call operator; consider capturing the name of the enclosing function explicitly

有什么方法可以捕获封闭函数的名称而无需在 lambda 之前用 const char* name = __FUNCTION__ 声明它并捕获 name。 IE。像这样:

#include <iostream>

int main()
{
    [&__FUNCTION__](){
        std::cout << __FUNCTION__ << std::endl;  // Should print "main".
    }();

    return 0;
}

上面的代码显然不会工作,因为宏会在预处理阶段展开。

限制的原因是因为一切都在将在表达式中使用的宏中,但我仍然想运行一些语句。例如:

#define ALLOCATE(allocator, size) [&](){                                            \
    std::cout << "Allocating in " << __FILE__ << ":" << __FUNCTION__ << std::endl;  \        
    return allocator.allocate(size);                                                \
}()

最佳答案

是的,从 C++14 开始,可以使用 lambda 捕获初始化器,它允许按名称捕获任意表达式。所以一个解决方案是:

#include <iostream>

int main()
{
    [function_name=__FUNCTION__](){
        std::cout << function_name << std::endl;  // Prints "main".
    }();

    return 0;
}

关于c++ - 如何在 lambda 捕获中显式捕获宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67764823/

相关文章:

c++ - GetOpenFileName() 杀死我的后台打开流 :(

c++ - 标准中术语相同、相等、等效的含义

java - 映射 ifPresent 函数

html - 移动 wordpress 站点后对 css 文件的错误请求

C程序输出

c - 奇怪的宏观行为

C++ 在代码中指定 header 包含目录

c++ - std::function、std::bind 和 std::ref 的 Clang 错误?

java - 在封闭范围内定义的局部变量 log 必须是最终的或有效最终的

lambda - 如何在 Clojure 中将 lambda 实现为名为 "lambda"的函数?