巨集定義開關和debug printf,巨集定義使用異或交換兩數
阿新 • • 發佈:2019-02-18
1、巨集定義開關和debug printf
#define DEBUG_PRINT 1
#ifdef DEBUG_PRINT
#define DEBUG(format, ...) printf("FILE: "__FILE__", LINE: %d: "format"\n", __LINE__, ##__VA_ARGS__)
#else
#define DEBUG(format, ...)
#endif
巨集定義DEBUG(str) 只支援一個引數的替換
自C99規範以後,編譯器就開始支援不定引數的巨集定義
#define DEBUG(format, ...) printf("FILE: "__FILE__", LINE: %d: "format"\n", __LINE__, ##__VA_ARGS__)
註釋1:##代表 如果可變引數被忽略或為空,將使得前處理器(perprocessor)會去掉它前面的那個逗號
註釋2:ANSI C標準中有幾個標準預定義巨集,__FILE__ 檔名,__LINE___ 行號
2、巨集定義使用異或交換兩數
#define swap(a, b) do{ \
(a) = (a) ^ (b); \
(b) = (b) ^ (a); \
(a) = (a) ^ (b); \
}while(0);
註釋1:異或,相同為0,不同為1;與0異或不變,與1異或相反;異或滿足交換律
1 #include <stdio.h> 2 3 #define DEBUG_PRINT 1 4 5 #ifdef DEBUG_PRINT 6 // 可變引數的巨集定義替換 7 // ##代表 如果可變引數為空,前處理器將去掉前面的逗號 8 // 標準預定義巨集 __FILE__檔名,__LINE__行號 9 #define DEBUG(format, ...) printf("FILE: "__FILE__", LINE: %d: "format"\n", __LINE__, ##__VA_ARGS__) 10 #else 11 #define DEBUG(format, ...) 12 #endif 13 14 #define swap(a, b) do{ \ 15 (a) = (a) ^ (b); \ 16 (b) = (b) ^ (a); \ 17 (a) = (a) ^ (b); \ 18 }while(0); 19 20 void bubble_sort_min(int *a, int len); 21 22 int main(int argc, char *argv[]) 23 { 24 int array[] = {3,4,5,6,2,7,0}; 25 int len = sizeof(array) / sizeof(int); 26 int i; 27 DEBUG("before sort: "); 28 for(i=0; i<len; i++) 29 DEBUG("%d ", array[i]); 30 DEBUG("\n"); 31 32 bubble_sort_min(array, len); 33 34 DEBUG("after sort: "); 35 for(i=0; i<len; i++) 36 printf("%d ", array[i]); 37 printf("\n"); 38 return 0; 39 } 40 41 void select_sort_min(int *a, int len) 42 { 43 int i, j; 44 45 for(i=0; i<len-1; i++) 46 for(j=i+1; j<len; j++) 47 { 48 if(a[j] < a[i]) 49 swap(a[j], a[i]); 50 } 51 52 } 53 54 void bubble_sort_min(int *a, int len) 55 { 56 int i, j; 57 for(i=0; i<len-1; i++) 58 for(j=0; j<len-1; j++) 59 if(a[j] > a[j+1]) 60 swap(a[j], a[j+1]); 61 }