【问题标题】:Is there any C macro that wraps a function?是否有任何包装函数的 C 宏?
【发布时间】:2020-02-21 15:49:46
【问题描述】:

有没有办法像我愿意用这种语法做的事情:

#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) ...吗?
  • 因为我想要括号,以便最终用户理解它的功能块,但无论如何,如果不可能(X,Y)可能没问题

标签: c macros c-preprocessor


【解决方案1】:

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

类似这样的:

#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");        \
    }                           \

【讨论】:

  • 最好把它写成可变参数宏。否则,Y 中未受保护的逗号会导致问题。
  • 一般来说,是的,但我相信在这种情况下,可变参数宏不能解决根本问题。 Y 中的任何未受保护的逗号都不会用作参数,而是用作源的一部分。在这种情况下,更好的解决方案是将有问题的参数命名为别名或将其括起来。
  • 作为一个具体的例子,WRAP(foo, if (arg > 2) { int a=1, b=2; ... })。逗号不受保护,会导致语法错误,WRAP 参数过多。如果你使用#define WRAP(x, ...) void x(int arg) { before(); __VA_ARGS__ after(); },那么问题就消失了。
猜你喜欢
  • 1970-01-01
  • 2020-11-28
  • 2012-04-29
  • 1970-01-01
  • 2013-01-15
  • 1970-01-01
  • 1970-01-01
  • 2013-02-24
  • 1970-01-01
相关资源
最近更新 更多