zoukankan      html  css  js  c++  java
  • 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);通过这种方式可以判断两个变量的类型是否一致。
  • 相关阅读:
    游戏开发人员眼中的Unity 3D网页游戏測评报告
    MQTT---HiveMQ源代码具体解释(八)Netty-WebSocket
    RGB 与 (RGB转 YCbCr再转为 RGB)的图像
    Shader的语法
    10种软件开发中 over-engineering 的错误套路
    LeetCode——Min Stack
    nyist 82迷宫寻宝(一)(BFS)
    云计算生态系统
    Linux 查看CPU信息、机器型号等硬件信息
    学习新技术的10个建议
  • 原文地址:https://www.cnblogs.com/black-mamba/p/6778004.html
Copyright © 2011-2022 走看看