未限定范围的多行 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; }()