2014-09-13 111 views
0

我想用myfree2()將free()中的所有包裝函數的實例替換爲myfree()。不幸的是,我無法讓它工作,因爲第二個宏重新定義了第一個。爲什麼第二個宏如果沒有參數就重新定義第一個宏呢?C宏重新定義

// I must delete this function or the macro will replace it as well and cause a syntax error! 
void myfree(void *p) 
{ 
    if(p != NULL) 
    free(p); 
} 

void myfree2(void *p) 
{ 
    if(p != NULL) 
    free(p); 
} 

#define myfree(p) do { myfree2(p); p = (void *)0xdeadbeef; } while (0); 
#define myfree myfree2 

myfree(p); // Wrapper around free(). 

afunc(arg, myfree); // Wrapper is used as a function argument! 
+3

'的#define myfree(P)做{myfree2(P); p =(void *)0xdeadbeef; } while(0)'** remove **分號,或者* funky do-while *沒有意義。 PLUS:'if(p!= NULL)free(p);'允許使用NULL參數自由調用。 – wildplasser 2014-09-13 18:02:23

+0

請避免使用宏。他們是生活中基本的東西。還有什麼你躲在地獄 – 2014-09-13 18:06:06

+0

@EdHeal我同意,但我認爲它在這種情況下更值得。 – 2014-09-14 07:43:14

回答

0

C預處理器不允許基於參數數量重載宏 - 您只能擁有給定名稱的單個宏。您可以通過在myfree的聲明中使用冗餘的圓括號避開你的情況這個問題:

#define myfree(p) do { myfree(p); p = (void *)0xdeadbeef; } while (0) 

void (myfree)(void *p) 
{ 
    if(p != NULL) 
    free(p); 
} 

myfree(p); // Wrapper around free(). 

afunc(arg, myfree); // Wrapper is used as a function argument!