typeof是GNU c标准的关键字。
typeof()的作用是自动推导出括号中表达式的数据类型。
1 #include <stdio.h> 2 3 void func1(void) 4 { 5 int a = 1; 6 typeof(int *)pa = &a;//pa的数据类型为int型的指针 7 8 printf("pa: %p ", pa); 9 printf("&a: %p ", &a); 10 printf("a: %d ", a); 11 printf("*pa: %d ", *pa); 12 } 13 14 void func2(void) 15 { 16 int b = 1; 17 typeof(&b)pb = &b;//&b的数据类型为int*,所以pb的类型为int*。 18 19 printf("pb: %p ", pb); 20 printf("&b: %p ", &b); 21 printf("b: %d ", b); 22 printf("*pb: %d ", *pb); 23 } 24 25 void func3(void) 26 { 27 int* pc = NULL; 28 typeof(*pc) c = 100;//pc的类型为int*,那么,*pc的类型即为int 29 printf("c=%d ",c); 30 } 31 32 void func4(void) 33 { 34 int i = 0; 35 int* pc = NULL; 36 typeof(*pc) arr[] = {1,2,3,4};//同样,*pc的类型为int 37 for(i = 0; i < 4; ++i) 38 printf("arr[%d]=%d ", i, arr[i]); 39 } 40 41 void func5(void) 42 { 43 int i = 0; 44 typeof(typeof(const char *)[4]) pchar = {"hello", "world", "good", "night"};
//里层typeof的类型为const char*,和外层结合后,pchar的数据类型即为const char*指针数组 45 for (i = 0; i < 4; i++) 46 printf("pchar[%d]:%s ", i, pchar[i]); 47 } 48 49 int add(int param1, int param2) 50 { 51 return param1 + param2; 52 } 53 54 int sub(int param1, int param2) 55 { 56 return param1 - param2; 57 } 58 59 int mul(int param1, int param2) 60 { 61 return param1 * param2; 62 } 63 64 void func6(void) 65 { 66 int (*func[3]) (int, int) = {add, sub, mul};//显然func的数据类型为函数指针数组,数组元素为函数指针。 67 68 typeof(func[0](1, 1)) sum = 100; //func[0](1,1)===>add(1,1)===>2,即 typeof(2)sum = 100; 69 typeof(func[1](1, 1)) dif = 101; 70 typeof(func[2](1, 1)) pro = 102; 71 72 printf("sum:%d ", sum); 73 printf("dif:%d ", dif); 74 printf("pro:%d ", pro); 75 } 76 77 #define pointer(T) typeof(T *) 78 #define array(T, N) typeof(T[N]) 79 80 void func7(void) 81 { 82 int i = 0; 83 array(pointer(char), 4) pchar = {"hello", "world", "good", "night"}; 84 for (i = 0; i < 4; i++) 85 printf("pchar[%d]:%s ", i, pchar[i]); 86 } 87 88 //from linux-3.5/include/linux/kernel.h 89 #define min(x, y) ({ 90 typeof(x) _min1 = (x); 91 typeof(y) _min2 = (y); 92 (void)(&_min1 == &_min2); 93 _min1 < _min2 ? _min1 : _min2; }) 94 95 96 int main(int argc, char** argv) 97 { 98 int a = 1; 99 //char b = 2; 100 int b = 2; 101 func1(); 102 func2(); 103 104 (void)12; 105 106 printf("%d ",min(a,b)); 107 func3(); 108 func4(); 109 func5(); 110 func6(); 111 func7(); 112 113 return 0; 114 }
附加知识点:
line 92包含两个知识点,
1.warning: statement with no effect
c语言中语句(statement)的用法,
正如104行,如果是 "12;"gcc编译时加上-Wall参数(高版本gcc可能不会报警告),会报warning: statement with no effect,即无效的语句。
2.warning: comparison of distinct pointer types lacks a cast
如果将106行中的b的数据类型改为char,编译时就会报出警告。
(&_min1 == &_min2);通过这种方式可以判断两个变量的类型是否一致。