typeof()关键字

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);通过这种方式可以判断两个变量的类型是否一致。
原文地址:https://www.cnblogs.com/black-mamba/p/6778004.html