有没有包装函数的C宏?

有没有包装函数的C宏?,c,macros,c-preprocessor,C,Macros,C Preprocessor,有没有一种方法可以像我愿意用这种语法做的那样: #define WRAP_MY_FUNCTION(x){Y} void x(int integer){printf("begin\n"); Y ; printf("end\n");} 所以我可以有这个 WRAP_MY_FUNCTION(Foo){printf("hello world\n");} 这相当于 void Foo(int integer) { printf("begin\n"); printf("hello world

有没有一种方法可以像我愿意用这种语法做的那样:

#define WRAP_MY_FUNCTION(x){Y} void x(int integer){printf("begin\n"); Y ; printf("end\n");}
所以我可以有这个

WRAP_MY_FUNCTION(Foo){printf("hello world\n");}
这相当于

void Foo(int integer)
{
    printf("begin\n");
    printf("hello world\n");
    printf("end\n");
}
输出

begin
hello world
end

注意:我更喜欢将函数代码放在括号中,以便最终用户理解这是一个代码块。

您可以将另一个参数传递给宏以定义打印语句

大概是这样的:

#define WRAP_MY_FUNCTION(x, Y) void x(int integer){printf("begin\n"); Y; printf("end\n");}

WRAP_MY_FUNCTION(Foo, printf("hello world\n"))
如果您想让最终用户更清楚地知道这是一个代码块,并且如rici所指出的,添加一个可变宏来修复源代码中可能存在的未受保护的逗号,您可以将定义重写为:

#define WRAP_MY_FUNCTION(x, ...)\
    void x(int integer)         \
    {                           \
        printf("begin\n");      \
        __VA_ARGS__             \
        printf("end\n");        \
    }                           \

用你的语法是不可能的。有没有理由不使用
#定义WRAP_MY_函数(x,Y).
?因为我想用括号让最终用户理解它是一个函数块,但无论如何,如果不可能(x,Y),最好将其写成一个可变宏。否则,
Y
中未受保护的逗号将导致问题。一般来说,是的,但我相信在这种情况下,可变宏无法解决根本问题。Y中任何未受保护的逗号都不会用作参数,而是作为源的一部分。在这种情况下,更好的解决方案是将有问题的参数化名或用括号括起来。作为一个具体的例子,
WRAP(foo,if(arg>2){inta=1,b=2;…})
。逗号不受保护,将导致语法错误,
WRAP
的参数太多。如果使用了
#define WRAP(x,…)void x(int arg){before();u VA_ARGS_uuuafter()}
,那么问题就消失了。