用宏包围一个函数

时间:2014-01-16 19:28:20

标签: c

我有一个.c文件,包含一些像

这样的函数
void foo(void)
{
...doSomeStuff...
}

现在,我想用一些代码包围这个函数,结果是

void foo(void)
{
    ...additional stuff...
    {
        ...doSomeStuff...
    }
    ...do more additional stuff...
}

简而言之,想要将整个函数放在一个“外部”函数中。

我尝试使用可以像这样使用的宏:

MAGIC_MACRO(foo)
{
...doSomeStuff...
}

这样,宏用户(或我)只需要使用foo函数的头部并用MAGIC_MACRO替换void返回类型。 MAGIC_MACRO将扩展到“附加和更多附加内容”部分。

好的,我认为这很容易。我试图像包含do-while(0)循环的这些宏一样实现它。嗯,最大的问题是“更多额外的东西”部分,它必须在旧函数的主体之后。

有什么想法吗? 问候,lugge

3 个答案:

答案 0 :(得分:3)

这不是我建议的,但你可以让宏创建一个包含进入/退出代码的函数,另一个包含用户给出的代码:

#include <stdio.h>

#define MAGIC_MACRO(f) \
    void f##_inner(void); \
    void f(void) { \
        printf("entry\n"); \
        f##_inner(); \
        printf("exit\n"); \
    } \
    void f##_inner()

MAGIC_MACRO(foo)
{
    printf("foo\n");
}

int main(void) {
    foo();
    return 0;
}

MAGIC_MACRO的调用将创建foofoo_inner个函数,其中foo调用foo_innerfoo_inner包含用户代码,允许在宏调用之后将其全部放入。

Live example

答案 1 :(得分:0)

  

简而言之,想要将整个功能放在其中   一个“外部”功能。

这种宏的语法必须将函数的整个主体作为参数,而不是

MAGIC_MACRO(foo)
{
...doSomeStuff...
}

MAGIC_MACRO(foo,
{
...doSomeStuff...
})

或者

MAGIC_MACRO(void foo(void),
{
...doSomeStuff...
})

该方法的真正问题在于,可以在主体中找到特殊字符,#pragma和其他东西,并且不能使用宏参数传输它们。

答案 2 :(得分:0)

你可以在几个宏组合中做到这一点:

#define BEGIN_INT_FUNCTION(name) \
  int name() {\
  do something...

#define END_INT_FUNCTION \
  do something...
  return 0; \
}
现在你编写了函数代码:

BEGIN_INT_FUNCTION(name)  // or without argument
{
  function body...
}
END_INT_FUNCTION

你这样称呼它:

int x = name();