有没有包装函数的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()}
,那么问题就消失了。