У меня есть шаблон, который в основном представляет собой шаблонный код с частью, которая изменяется в середине
if(condition){
struct Foo m = start_stuff();
{ m.foo = bar(1,2); m.baz = 17; } //this part varies
end_stuff();
}
Можно ли сделать макрос taht, который принимает этот промежуточный код в качестве аргумента? Правила для макрорасширения в C кажутся ужасно сложными, поэтому я не уверен, нет ли каких-либо угловых случаев, которые могли бы произойти и укусить меня в будущем (в частности, я не понимаю, как аргументы макроса разделяются, если мой код в нем есть запятые).
#define MY_MACRO(typ, do_stuff) do { \
if(condition){ \
struct typ m = start_stuff(); \
do_stuff; \
end_stuff(); \
} \
}while(0)
//usage
MY_MACRO(Foo, {
m.foo = bar(1,2);
m.baz = 17;
});
До сих пор единственное, что мне удалось представить, - это break
и continue
получать захваченные, если я использую петлевые операторы в моем макросе, и это было бы приемлемым компромиссом для моего конкретного случая использования.
edit: Конечно, я бы использовал функции, если мог. Пример, который я использовал в этом вопросе, упрощен и не отображает биты, которые могут работать только с магии.