C語言筆記-用__VA_ARGS__ 完程多列表的宏定義
如果現在想要發送兩個任意長度列表,可以這樣做
假設現在程式顯示一個訊息,同時將一個機器獨的錯誤碼發送到日誌:
他會被拓展成:
下面試另一個例子:
給出兩列R和C,每個單元(i,j)保持Ri Cj的乘積,此城市的核心是matrix_cross宏
可以看出程式中,透過matrix_cross這個宏將長度可變的陣列傳送至函式理面
此文章內容參考"21 century c"一書,在此做筆記
如須刪除請告知 謝謝
假設現在程式顯示一個訊息,同時將一個機器獨的錯誤碼發送到日誌:
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"一書,在此做筆記
如須刪除請告知 謝謝
留言
張貼留言