Опасности с многострочным MACROS с незаданной областью - PullRequest
1 голос
/ 28 мая 2019

Есть ли способ защитить этот 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();

1 Ответ

3 голосов
/ 28 мая 2019

Просто используйте лямбду, чтобы объединить ваши утверждения обратно в выражение.Используйте его везде, где может появиться выражение, к вашему сердцу.Даже в выражении выражения внутри if без фигурных скобок.

#define FOO(X, Y, ...) [&] { \ 
  auto ret = X->bar(_##Y->thatVar, __VA_ARGS__);\
  post_op(X, Y); \
  return ret; }()
...