C語言筆記-用__VA_ARGS__ 完成free_all() 函式向量化

free()是一個長見的函式,不過他一次只能接受一個參數
因此常常在函式尾巴必須加上一堆釋放記憶體的工作:


free(ptr1);
free(ptr2);
free(ptr3);

這樣的程式碼很不美觀,很冗長,寫成這樣:


free_all(ptr1,ptr2,ptr3);


完成方法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <stdlib.h>

#define Fn_apply(type,fn,...){\
 void *stopper_for_apply=(int[]){0};\
 type **list_for_apply=(type*[]){__VA_ARGS__,stopper_for_apply};\
                 \
 for(int i=0;list_for_apply[i]!=stopper_for_apply;i++)\
  fn(list_for_apply[i]);\
}

#define Free_all(...) Fn_apply(void, free,__VA_ARGS__);

 
int main(void)
{
 int *x=malloc(1000);
 int *y=malloc(1000);
 int *z=malloc(1000);

 Free_all(x,y,z);
}

第5行:
    提高安全性,

第6行:
    需要一個終止符,卻保不與任何使用中的指標匹配,包括任何的NULL指標。
因此我們使用複合常量形式定義醫包含整數的陣列,並定義一個指向這個陣列的指標。
for迴圈的終止條件所觀察的是指標本身,而不是他指向的東西












留言

這個網誌中的熱門文章

FreeRTOS學習筆記 (二)-任務創建和刪除(xTaskCreate及vTaskDelete)

FreeRTOS學習筆記 (三)-時間管理vTaskDelay()及vTaskDelayUntil()

MCU的硬體基礎知識(2) 電晶體的應用