2014-01-16 90 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();