使用 lambda 和 __attribute__ 理解宏代码语句

Understanding macro code statement with lambda and __attribute__

我的程序 (C++) 正在为 throw 语句定义一个宏。它是这样的:

#define FOO_THROW(some-exception-type, some-error-message)  \
    do                                                      \
        {                                                   \
            [&]() __attribute__((cold, noinline))           \
            {                                               \  
                using exception_type = some-exception-type; \     
                std::ostringstream ss;                      \
                ss << some-error-message << "";             \               
                throw exception_type(ss.str());             \
            }                                               \
            ();                                             \
        }                                                   \
    while (0);

然后,它在程序中被调用,类似于:

FOO_THROW(std::runtime_error, "error specfic message here")

我可以看到我们在宏中使用了do...while(0)结构,我想了解的是这里使用lambda__attribute__,谁能用简单的话解释一下?

基本上,我的重点是这里需要什么 lambda 函数,什么时候可以不用它,这里有什么具体的优势吗?

我是 C++ 的初学者,所以任何正确方向的提示都可以!

do...while(0) 允许宏在最后用分号调用,即 macro(x,y,z); (注意最后的分号),这是从 C 回来的老把戏,你可以查一下separately.

至于其余...它定义了一个 lambda(立即函数对象)通过引用捕获所有内容(不确定为什么),它会抛出具有给定消息的给定类型的异常并立即调用它,有效地抛出异常.

这些属性表示 lambda 不太可能被调用 (cold) 并防止内联 (noinline),请参阅:https://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/Function-Attributes.html