zoukankan      html  css  js  c++  java
  • typedef 详解

    一行很常用的代码:

    typedef int XX_Size_Check[(sizeof(XX)==64)? 1:-1];
    

    很容易猜到上面这行代码是要在编译时检查XX的size,但再深究点,我们就会发现它跟我们平时typedef的写法不太一致。

    typedef用法小结

    对已有类型定义别名

    typedef <old type name> <new alias>;
    

    这是最常见的写法,主要用途有

    • 结构体

    举个例子,我们这里定义了一个结构体MyStruct,在C里面,如果要定义该类型的变量,则需要写struct关键字。(C++里在不产生歧义的情况下可以省略。)

    struct MyStruct {
        int data1;
        char data2;
    };
    struct MyStruct a;
    

    我们可以使用typedef来简化书写:

    typedef struct MyStruct newtype;
    
    newtype a;
    

    当然也可以直接写成这样:

    typedef struct MyStruct {
        int data1;
        char data2;
    } newtype;
    

    或者更简单的:

    typedef struct {
        int data1;
        char data2;
    } newtype;
    
    
    • 指针
    typedef struct Node* NodePtr;
    ...
    NodePtr startptr, endptr, curptr, prevptr, errptr, refptr;
    

    函数指针

    不使用typedef,我们会这样写:

    int do_math(float arg1, int arg2) {
        return arg2;
    }
     
    int call_a_func(int (*call_this)(float, int)) {
        int output = call_this(5.5, 7);
        return output;
    }
     
    int final_result = call_a_func(&do_math);
    

    使用typedef:

    typedef int (*MathFunc)(float, int);
     
    int do_math(float arg1, int arg2) {
        return arg2;
    }
     
    int call_a_func(MathFunc call_this) {
        int output = call_this(5.5, 7);
        return output;
    }
     
    int final_result = call_a_func(&do_math);
    

    这里typedef后面跟了一个函数指针类型 int (*MathFunc)(float, int),通过这个语句,MathFunc成为该函数指针类型的别名。

    数组

    typedef int vector[10];
    
    vector a;
    a[9] = 100;
    

    和函数指针比较类似,typedef后面跟了一个数组类型(元素类型为int,数组长度为10),通过这个语句,vector成为该数组类型的别名。
    也可以定义多维数组。

    参考:

    Wikipedia: typedef

    Jason Damon: 使用typedef语句定义数组类型

  • 相关阅读:
    【转】线程的7种状态及相互转换
    java timer 使用:
    LayoutInflater
    java中Thread与Runnable的区别
    php上传程序到服务器后出错smarty1259
    cakephp ajax
    纯真IP数据库的应用IP地址转化成十进制
    对数组里的元素进行排序
    smarty中的cache_id问题
    箴言
  • 原文地址:https://www.cnblogs.com/garcia-0/p/4564020.html
Copyright © 2011-2022 走看看