标签: nesc

可以使用代码块作为C宏的参数吗?

我有一个模式,基本上是一些样板代码,其中一部分在中间变化

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)

到目前为止,我设法想到的唯一一件事就是如果我在宏中使用循环语句breakcontinue被捕获,这对我的特定用例来说是一个可接受的权衡.

编辑:当然,如果可以的话,我会使用一些功能.我在这个问题中使用的示例是简化的,并没有展示只能用于宏魔术的位.

c macros nesc

18
推荐指数
2
解决办法
7626
查看次数

标签 统计

c ×1

macros ×1

nesc ×1