Есть ли способ защитить этот 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();
Полная защита может быть достигнута без использования макросов.
@StoryTeller нельзя использовать для МАКРОСОВ с возвращаемым значением
Макрос, охватывающий несколько операторов, не может иметь «возвращаемое значение». Вы действительно должны лучше понять, как ведут себя макросы. Они являются заменой токенов, не более.
@Yksisarvinen Я слишком упростил свое приложение. Вопрос отредактирован.
@StoryTeller Я не вижу реальной разницы с точки зрения токена; между многострочными макросами и макросами с возвращаемым значением
Несколько утверждений, а не несколько строк, было моей точной формулировкой по определенной причине. Линии несущественны.
Просто используйте лямбда-выражение, чтобы собрать ваши операторы обратно в выражение. Используйте его везде, где может появиться выражение, сколько душе угодно. Даже в операторе выражения внутри if
без фигурных скобок.
#define FOO(X, Y, ...) [&] { \
auto ret = X->bar(_##Y->thatVar, __VA_ARGS__);\
post_op(X, Y); \
return ret; }()
Именно то, что я искал. Спасибо миллион!