2014-01-08 96 views
1

我想要寫在C代碼宏來釋放許多指針像這樣釋放指針:如何在C使用宏

FREE(ptr1, ptr2, ptr3, ptr4, ptrx); 

對於我來說,這是事先優於

FREE(ptr1); 
FREE(ptr2); 
FREE(ptr3); 
FREE(ptr4); 
FREE(ptrx); 

謝謝

問候,

+6

這是不是更好。這絕對是愚蠢的。 -1。它只會混淆每個新開發人員,並不會真正幫助任何事情。 –

+1

我相信這是可能的可變宏,但寫一個可變宏的這是相當矯枉過正。確保在數組或其他可比數據結構更合理的情況下,您不會使用數十個變量。 – user2357112

+0

你確定無法幫助減少c代碼行數! –

回答

4

您可以通過在宏變量數量的參數。以下代碼可以正常工作:

#define FREE_ALL(...) \ 
do { \ 
    int i=0;\ 
    void *pta[] = {__VA_ARGS__}; \ 
    for(i=0; i < sizeof(pta)/sizeof(void*); i++) \ 
    { \ 
     free(pta[i]); \ 
    }\ 
} while(0) 
+0

所有多行宏應包含do {} while語句。對於C函數參數以外的任何其他函數參數,__VA_ARGS__也不是C標準規定的,其結果可能會因編譯器不同而有所不同。 – this

1

也許你可以這樣定義一個函數:

void freeargs(void *ptr1, ...) { 
    // code for freeing variable number of arguments until NULL pointer. 
} 

,然後宏:

#define FREE(...) freeargs(__VA_ARGS__, NULL) 
+1

您的解決方案看起來不錯但是,如果其中一個輸入指針爲NULL,它將無法正常工作 – MOHAMED

+0

如果其中一個指針已經是NULL,則失敗。也許有一個特殊的值(例如靜態變量的地址等)作爲停止標記會很有用。 – glglgl

+0

如果在原始程序崩潰的參數中有一個NULL指針。 – Marian

0

我認爲這是一箇中性的概念。積極:如果你想一起釋放指針,它可以幫助,但它似乎並沒有節省很多東西。 否定:如果指針可能分散散開,那麼您應該等待它們使用,這可能會導致指針被忽略。 順便說一下,MacOS的可

#define FREE(ptr1, ptr2, ptr3, ptr4, ptrx) (free(ptr1);free(ptr2);free(ptr3);free(ptr4);free(ptr5);) 
5

使用函數參數數量可變的函數。標題:stdarg.h

我對解決方案有點樂趣。

#define FREE(...) Free(&free_stop , __VA_ARGS__ , &free_stop) 
//takes any number of pointer arguments,(at least one)(can also take NULL which is handled by free) 

int free_stop ; 

void Free(void* point , ...) 
{ 
    if(!point) 
     return ; 

    va_list list ; 
    va_start(list , point) ; 

    void* p = va_arg(list , void*) ; 
    while(p != point) 
    { 
     free(p) ; 
     p = va_arg(list , void*) ; 
    } 


    va_end(list) ; 

} 

用法:

FREE(ptr1 , ptr2 , ptr3) ; //don't have to NULL terminate 
+0

我想避免包含新的頭文件「stdarg.h」,因此我選擇了user3162146的解決方案;謝謝 –

+0

@self是否可以使用Free函數的地址而不是'int free_stop'這樣的地址:'Free(&Free,__VA_ARGS__,&Free)' – MOHAMED

0

使用BOOST

#include <boost/preprocessor/seq/for_each.hpp> 
#include <boost/preprocessor/tuple/to_seq.hpp> 

#define PROC(r, f, elem) f(elem); 
#define FREE(...) BOOST_PP_SEQ_FOR_EACH(PROC, free, BOOST_PP_TUPLE_TO_SEQ((__VA_ARGS__))) 
+0

這是否適用於c? – this

+0

@自己是的,只需要預處理器。 – BLUEPIXY