2014-01-16 44 views
4

我有一个.c文件,包含类似环绕功能与宏

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

一些功能现在,我想围绕一些代码的功能,导致

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

总之,想要把功能的整个身体放在一个“外部”功能中。

我试图把它与可以这样使用宏工作:

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

这样,宏用户(或我)只是要采取foo的函数的头部和更换返回void键入MAGIC_MACRO的东西。 MAGIC_MACRO将扩展到“额外的和更多的东西”部分。

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

对此有何看法? 问候,lugge

+2

我不完全可以看到这一点。为什么不简单地从另一个函数调用'foo'?如果你想“替换”foo,只需改变原来的名字(如果你真的喜欢它,可以用宏)。 – Mat

+2

使用宏来“隐藏”某些东西是一种可怕的滥用。 –

+0

我已经删除了C++标记,因为它显然是一个c文件。如果它实际上是一个C++文件,然后添加标签。 –

回答

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

0

总之,要采取函数的整个身体,并把它放在 一个“外”的功能。

为这样一个宏语法将不得不采取函数作为参数,这是不

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

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

或也许

MAGIC_MACRO(void foo(void), 
{ 
...doSomeStuff... 
}) 
的整个身体

该方法的实际问题是看到的是, re是特殊字符,#pragma和其他可以在body中找到的东西,并且它们不能使用宏参数传输。

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();