使用 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
我的程序 (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