我有一个模式,基本上是一些样板代码,其中一部分在中间变化
if(condition){
struct Foo m = start_stuff();
{ m.foo = bar(1,2); m.baz = 17; } //this part varies
end_stuff();
}
Run Code Online (Sandbox Code Playgroud)
是否可以使宏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;
});
Run Code Online (Sandbox Code Playgroud)
到目前为止,我设法想到的唯一一件事就是如果我在宏中使用循环语句break而continue被捕获,这对我的特定用例来说是一个可接受的权衡.
编辑:当然,如果可以的话,我会使用一些功能.我在这个问题中使用的示例是简化的,并没有展示只能用于宏魔术的位.