C語言筆記-用__VA_ARGS__ 完程多列表的宏定義

如果現在想要發送兩個任意長度列表,可以這樣做

假設現在程式顯示一個訊息,同時將一個機器獨的錯誤碼發送到日誌:



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

#define fileprintf(...) fprintf(stderr,__VA_ARGS__)

#define doubleprintf(human,machine) do{\
 printf human;\
 fileprintf machine;\
}while(0) 

int main(void)
{
 int x=-1;
 if(x<0)
  doubleprintf(("x is negative(%d)\n",x),("NEGVAL:x=%d\n",x));
  
}

他會被拓展成:

1
2
do {printf ("x is negative (%d)\n", x); fileprintf ("NEGVAL: x=%d\n", x);}
while(0); 


下面試另一個例子:
給出兩列R和C,每個單元(i,j)保持Ri Cj的乘積,此城市的核心是matrix_cross宏


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define make_a_list(...) (double[]){__VA_ARGS__,NAN}

#define matrix_cross(list1,list2) matrix_cross_base(make_a_list list1,\
  make_a_list list2)
  
void matrix_cross_base(double *list1,double *list2){
 int count1=0,count2=0;
 while(!isnan(list1[count1])) count1++;
 while(!isnan(list2[count2])) count2++;
 for(int i=0;i<count1;i++)
 {
  for(int j=0;j<count2;j++)
  {
   printf("%g\t",list1[i]*list2[j]);
  }
  printf("\n");
 }
 printf("\n\n");
}  

int main(void)
{
 matrix_cross((1,2),(3,4));
 matrix_cross((3,3,4,4),(1.3,45,6.7));
}


可以看出程式中,透過matrix_cross這個宏將長度可變的陣列傳送至函式理面





此文章內容參考"21 century c"一書,在此做筆記
如須刪除請告知 謝謝

留言

這個網誌中的熱門文章

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

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

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