我有一个.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
答案 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
的调用将创建foo
和foo_inner
个函数,其中foo
调用foo_inner
。 foo_inner
包含用户代码,允许在宏调用之后将其全部放入。
答案 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();