我想要寫在C代碼宏來釋放許多指針像這樣釋放指針:如何在C使用宏
FREE(ptr1, ptr2, ptr3, ptr4, ptrx);
對於我來說,這是事先優於
FREE(ptr1);
FREE(ptr2);
FREE(ptr3);
FREE(ptr4);
FREE(ptrx);
謝謝
問候,
我想要寫在C代碼宏來釋放許多指針像這樣釋放指針:如何在C使用宏
FREE(ptr1, ptr2, ptr3, ptr4, ptrx);
對於我來說,這是事先優於
FREE(ptr1);
FREE(ptr2);
FREE(ptr3);
FREE(ptr4);
FREE(ptrx);
謝謝
問候,
您可以通過在宏變量數量的參數。以下代碼可以正常工作:
#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)
所有多行宏應包含do {} while語句。對於C函數參數以外的任何其他函數參數,__VA_ARGS__也不是C標準規定的,其結果可能會因編譯器不同而有所不同。 – this
也許你可以這樣定義一個函數:
void freeargs(void *ptr1, ...) {
// code for freeing variable number of arguments until NULL pointer.
}
,然後宏:
#define FREE(...) freeargs(__VA_ARGS__, NULL)
我認爲這是一箇中性的概念。積極:如果你想一起釋放指針,它可以幫助,但它似乎並沒有節省很多東西。 否定:如果指針可能分散散開,那麼您應該等待它們使用,這可能會導致指針被忽略。 順便說一下,MacOS的可
#define FREE(ptr1, ptr2, ptr3, ptr4, ptrx) (free(ptr1);free(ptr2);free(ptr3);free(ptr4);free(ptr5);)
使用函數參數數量可變的函數。標題: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
我想避免包含新的頭文件「stdarg.h」,因此我選擇了user3162146的解決方案;謝謝 –
@self是否可以使用Free函數的地址而不是'int free_stop'這樣的地址:'Free(&Free,__VA_ARGS__,&Free)' – MOHAMED
這是不是更好。這絕對是愚蠢的。 -1。它只會混淆每個新開發人員,並不會真正幫助任何事情。 –
我相信這是可能的可變宏,但寫一個可變宏的這是相當矯枉過正。確保在數組或其他可比數據結構更合理的情況下,您不會使用數十個變量。 – user2357112
你確定無法幫助減少c代碼行數! –