返回介绍

5. 别名

发布于 2024-10-12 21:58:08 字数 1460 浏览 0 评论 0 收藏 0

为通用类型取别名,命名未命名类型,替换复杂命名。让别名在上下文有更具体含义,使源码更易阅读和理解。

typedef <data_type> <new_name>;
typedef unsigned int       size_t;
typedef unsigned long long id_t;

typedef int                code_t[6];    // 数组 (code_t ==> int[6])
typedef int                *num_t;       // 指针 (num_t  ==> int*)
typedef void (*callback_t)(char*, int);  // 函数指针 (func pointer)

别名对编译器来说,和原类型没什么区别,可直接隐式转换。

typedef uint8_t  byte_t;          // 别名。
typedef int      code_t, id_t;    // 定义多个别名。

typedef char     char_t, *str_t;  // 注意:char, char*
code_t x = 1;
id_t   y = x;
int    z = y;

为未命名类型提供有意义的名字,提升代码可读性。

typedef char  *str_t;         // 指针:   str_t     ==> char*
typedef str_t strings_t[];    // 指针数组:strings_t ==> (char*)[]
int main (void)
{
    strings_t ss = {"a1", "a2", "a3"};

    for (int i = 0; i < sizeof(ss) / sizeof(ss[0]); i++) {
        puts(ss[i]);
    }

    return 0;
}

#define

#define 预处理文本替换不同, typedef 是编译器针对具体类型操作。

int main (void)
{
    #define str_t char *
    str_t a, b;          // char* a, b; ==> char *a, char b

    static_assert(sizeof(a) == 8);
    static_assert(sizeof(b) == 1);
    return 0;
}
int main(void) 
{
    typedef char *str_t;
    str_t a, b;         // char *a, char *b;

    static_assert(sizeof(a) == 8);
    static_assert(sizeof(b) == 8);
    return 0;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文