zoukankan      html  css  js  c++  java
  • c++ typedef usage

    用途

    1. 简化代码书写,尤其使用boost库,iterator或者指针等

    typedef boost::filesystem::recursive_directory_iterator bf_rdit;
    typedef char * PCHAR;// PCHAR p1, p2; // both p1 and p2 are pointer

    2. 实现跨平台

    #ifdef _WIN32 || WIN32
    typedef __uint64 UINT64;
    #else
    typedef unsigned long long UINT64
    #endif

    使用

    自定义枚举值

    typedef enum {SUCCESS, FAIL} ERET;

    自定义结构体/类

    typedef struct {
    char * data;
    int length;
    } Buffer;

    函数指针

    • 全局函数
    typedef int (*BinaryOp)(int, int);
    int g_Add(int lhs, int rhs)
    {
    return lhs + rhs;
    }

    // main function
    {
    BinaryOp pAdd = g_Add;
    cout<<(*pAdd)(1,1)<<endl;
    }
    • 类静态成员函数
    class CTestMath
    {
    public:
    static int s_Add(int lhs, int rhs);
    };
    // main function
    {
    BinaryOp ps_Add = CTestMath::s_Add;
    cout<<(*ps_Add)(1,1)<<endl;
    }
    • 类成员函数
    class CTestMath
    {
    public:
    CTestMath();
    virtual ~CTestMath();
    int m_Add(int lhs, int rhs);
    protected:
    private:
    };
    // main function
    CTestMath *pinst = new CTestMath; // must
    BinaryOp pm_Add = &CTestMath::m_Add;
    cout<<(pinst->*pm_Add)(1,1)<<endl;
    delete pinst;
    • 结构体包含同类型指针
    如下声明是不对的,因为Node是typedef出来的别名,而typedef是需要根据已有的结构类型来重命名的,现在_Node结构体还没有声明出来,就使用Node来作为类型来声明Next指针是不对的.
    typedef struct _Node
    {
    int data;
    Node * Next;
    } Node;
    解决方法有1. 先声明_Node结构体,同时使用typedef重命名结构名为Node.
    typedef struct _Node{
    int data;
    struct _Node * Next;
    } Node;
    2. 或者先使用typedef来给一个还没有完全声明的类型起新名字,这跟第一钟情况是不一样的,因为它还没有开始创建呢
    typedef struct _Node Node, * PNode;
    struct _Node{
    int data;
    PNode Next;
    };
    不过建议还是用规范的第三种,
    struct _Node{
    int data;
    struct _Node * Next;
    };
    typedef struct _Node Node, * PNode;
     

    作用域


    typedef可以在类中函数中出现,如果出现在类中,还跟public/private/protected的访问规则有关
    class Test
    {
    public:
    typedef char Buf[256];
    };

    // main function
    {
    Test::Buf buf;
    cout<<sizeof(buf)<<endl;// 256
    }

    难点

    typedef的使用在模块化编程中使用很多,也会出现很多难懂的声明
    typedef int (*a[5])(int, int);
    a是长度为5的数组指针,数组元素为函数指针,指向int(*)(int, int)函数签名
    typedef void (*b[10]) (void (*)());
    b是长度为10的数组指针,数组元素为函数指针,指向没有返回值,输入参数为一个函数指针的函数指针
     

    误区

    与define的区别
    define是预编译中字符创形式替换代码,而typedef是具有强类型校验
    //#define PCHAR char *;
    typedef char * PCHAR;
    int func(const PCHAR, const PCHAR);
    上述代码中如果PCHAR是使用define定义的,那实际函数需要的参数是const char *,而使用typedef将是char * const



     
     
    误区

  • 相关阅读:
    Java的审计项目导入---基于现有的微服务项目上再加个xmsj
    vo中对date格式的时间格式的处理,方便到前台展示
    Java的Maven项目的导入
    [2020-05]测试短信发送记录
    那些年总是记不住的前端写法!
    【HTML+CSS】比较清淡的一个表格。
    C# 里这么写 busiDate.replace('-', ' ').trim(),可以把2020-04-01转为 20200401;java里这么些只能转为2020 04 01……
    radType条件没有用?
    我的程序里面出现了下面的警告:Unreachable code请问是什么原因?该怎么解决呢?
    ubuntu18.04安装Charles及问题
  • 原文地址:https://www.cnblogs.com/rogerroddick/p/3072812.html
Copyright © 2011-2022 走看看