未限定范围的多行 MACROS 的危险
Dangers with unscoped multiline MACROS
有没有办法保护此 MACRO 不受未限定范围的 if/for 语句的影响?
#define FOO(X, Y, ...) X->bar(_##Y->thatVar, __VA_ARGS__);\
post_op(X, Y)
bar 和 post_op 的顺序很重要,应用程序可以忽略 post_op 的结果
即
if(true)
auto z = FOO(a,b);
else //compile error
abort();
只需使用 lambda 将您的语句重新聚合回表达式。随心所欲地在任何可能出现表情的地方使用它。即使在 if
内没有大括号的表达式语句中。
#define FOO(X, Y, ...) [&] { \
auto ret = X->bar(_##Y->thatVar, __VA_ARGS__);\
post_op(X, Y); \
return ret; }()
有没有办法保护此 MACRO 不受未限定范围的 if/for 语句的影响?
#define FOO(X, Y, ...) X->bar(_##Y->thatVar, __VA_ARGS__);\
post_op(X, Y)
bar 和 post_op 的顺序很重要,应用程序可以忽略 post_op 的结果
即
if(true)
auto z = FOO(a,b);
else //compile error
abort();
只需使用 lambda 将您的语句重新聚合回表达式。随心所欲地在任何可能出现表情的地方使用它。即使在 if
内没有大括号的表达式语句中。
#define FOO(X, Y, ...) [&] { \
auto ret = X->bar(_##Y->thatVar, __VA_ARGS__);\
post_op(X, Y); \
return ret; }()