C语言中的奇技淫巧
一.交换两个变量的值
/*常规写法*/ int temp = a; a = b; b= temp; /*二进制写法*/ a ^= b ^= a ^= b;
二.计数
#include <stdio.h> int main(int argc, char** argv) { int x = 10; while (x --> 0) { printf("%d ", x); } return 0; }
会打印出9 8 7 6 5 4 3 2 1 0 相当于 (x--) > 0,先执行x--,返回x;再执行x>0;最后执行x = x - 1;
三.匿名数据结构
struct mylist { int a; struct mylist* next; }; #define cons(x, y) (struct mylist[]){{x, y}} struct mylist *list = cons(1, cons(2, cons(3, NULL))); struct mylist *p = list;
四.函数重载
#define DFLT -1 #define ARG(X) X #define _VA_ARG_NUM(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,N,M,...) ((N==M+1)?((N==1)?((#A0)[0]!=0):N):DFLT) #define VA_ARG_NUM(...) _VA_ARG_NUM(__VA_ARGS__,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,-1) #define _VA_ARG0(A0,...) A0 #define _VA_ARG1(A0,A1,...) A1 #define _VA_ARG2(A0,A1,A2,...) A2 #define _VA_ARG3(A0,A1,A2,A3,...) A3 #define _VA_ARG4(A0,A1,A2,A3,A4,...) A4 #define _VA_ARG5(A0,A1,A2,A3,A4,A5,...) A5 #define _VA_ARG6(A0,A1,A2,A3,A4,A5,A6,...) A6 #define _VA_ARG7(A0,A1,A2,A3,A4,A5,A6,A7,...) A7 #define _VA_ARG8(A0,A1,A2,A3,A4,A5,A6,A7,A8,...) A8 #define _VA_ARG9(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,...) A9 #define _VA_ARG10(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,...) A10 #define _VA_ARG11(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,...) A11 #define _VA_ARG12(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,...) A12 #define _VA_ARG13(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,...) A13 #define _VA_ARG14(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,...) A14 #define _VA_ARG15(A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,...) A15 #define VA_ARG0(...) ARG(_VA_ARG0(__VA_ARGS__,DFLT)+0) #define VA_ARG1(...) ARG(_VA_ARG1(__VA_ARGS__,DFLT,DFLT)) #define VA_ARG2(...) ARG(_VA_ARG2(__VA_ARGS__,DFLT,DFLT,DFLT)) #define VA_ARG3(...) ARG(_VA_ARG3(__VA_ARGS__,DFLT,DFLT,DFLT,DFLT)) #define VA_ARG4(...) ARG(_VA_ARG4(__VA_ARGS__,DFLT,DFLT,DFLT,DFLT,DFLT)) #define VA_ARG5(...) ARG(_VA_ARG5(__VA_ARGS__,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT)) #define VA_ARG6(...) ARG(_VA_ARG6(__VA_ARGS__,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT)) #define VA_ARG7(...) ARG(_VA_ARG7(__VA_ARGS__,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT)) #define VA_ARG8(...) ARG(_VA_ARG8(__VA_ARGS__,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT)) #define VA_ARG9(...) ARG(_VA_ARG9(__VA_ARGS__,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT)) #define VA_ARG10(...) ARG(_VA_ARG10(__VA_ARGS__,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT)) #define VA_ARG11(...) ARG(_VA_ARG11(__VA_ARGS__,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT)) #define VA_ARG12(...) ARG(_VA_ARG12(__VA_ARGS__,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT)) #define VA_ARG13(...) ARG(_VA_ARG13(__VA_ARGS__,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT)) #define VA_ARG14(...) ARG(_VA_ARG14(__VA_ARGS__,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT)) #define VA_ARG15(...) ARG(_VA_ARG15(__VA_ARGS__,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT,DFLT)) #define mzcreate(...) (\ (VA_ARG_NUM(__VA_ARGS__)==0)?zcreate(1,2,3,4):\ (VA_ARG_NUM(__VA_ARGS__)==2)?zcreate(VA_ARG0(__VA_ARGS__),VA_ARG1(__VA_ARGS__),0,0):\ (VA_ARG_NUM(__VA_ARGS__)==3)?zcreate(VA_ARG0(__VA_ARGS__),VA_ARG1(__VA_ARGS__),VA_ARG2(__VA_ARGS__),0):\ (VA_ARG_NUM(__VA_ARGS__)==4)?zcreate(VA_ARG0(__VA_ARGS__),VA_ARG1(__VA_ARGS__),VA_ARG2(__VA_ARGS__),VA_ARG3(__VA_ARGS__)):\ NULL\ ) void zcreate(int a, int b, int c, int d) { GTK_LOG_INF(GTK_DBG_DRV_UART, "[%s]------------a:%d, b:%d, c:%d, d:%d", __func__ ,a ,b ,c ,d); }
调用
mzcreate(); mzcreate(11,22); mzcreate(11,22,33); mzcreate(11,22,33,44);
VA_ARG_NUM(VA_ARGS) :获得参数个数。
VA_ARG0(VA_ARGS):参数列表中的第1个参数。
VA_ARG1(VA_ARGS):参数列表中的第2个参数。
五.数组指定成员初始化
int a[10] = { [0] = {1}, [1] = {4}, [2] = {5}, };

浙公网安备 33010602011771号