C语言 typedef 简单应用技巧


出处:博客 八月初十
先耐心看看代码


#include <stdio.h>
                        
typedef /*auto*/ char * pchar; // 指针定义;
/*注释的地方,主要是为说明,typedef也是一个存储类型关键字(register, auto, static一样),如果打开注释,会报“错误:声明指定了多个存储类” */
typedef /*static*/ int iarray[2]; // int数组定义
typedef char carray[2]; // char数组定义
typedef char * parray[2]; // 指针数组定义
typedef double darray[5][5]; // 二维数组定义
typedef int func(void);  // 函数定义
                        
typedef struct /*user*/ { //注释的地方可以打开,注释掉就是匿名结构体
    char name[32];
    int age;
} user;
                        
typedef int (*pfunc)(user u);  // 函数指针定义
                        
//技巧一,使用typedef,简化结构体,易于数组结构使用
user userGroup[2] = {{"userName1", 23},{"userName2", 32}}; // 不使用typedef无法使用此种方式初始化数组
                        
//技巧二,使用typedef,简化函数参数,便函数清晰简单
int showUser(user u) { // 使用
    printf("name:%s, age:%d\n", u.name, u.age);
    return 0;
}
                        
// 技巧三,使用typedef,定义函数指针,很多有限状态机会用这个技巧做函数状态跳转
pfunc pf = showUser;
                        
int main(int argc, char * argv[]) {
    pchar pc;
    printf("char * pchar size = %d\n", (int) sizeof pc); // 这里可以不加括号,下面的用法必须加括号
    printf("int iarray[2] size = %d\n", (int) sizeof(iarray));
    printf("char carray[2] size = %d\n", (int) sizeof(carray));
    printf("char * parray[2] size = %d\n", (int) sizeof(carray));
    printf("double carray[5][5] size = %d\n", (int) sizeof(darray));
    printf("int func size = %d\n", (int) sizeof(func));
    printf("struct user size = %d\n", (int) sizeof(user));
    printf("int (*pfunc) size = %d\n", (int) sizeof(pfunc));
    printf("function size = %d\n", (int) sizeof(showUser)); // 这里只占一个字节,可以思考下。
                        
    pf(userGroup[0]); // 这里用typedef简化了Struct当参数
    pf(userGroup[1]);
                        
    return 0;
}


总结:
1.  通用变量定义

typedef short int_16
typedef unsigned short uint_16

int_16 等价于 short
uint_16 等价于 unsigned short
一般用这样的方式,做可移植代码,提高代码的兼容性


2. 数组变量定义

typedef uint_16 uint_16_array[2];
typedef char char_array[2];

uint_16_array 等价于 uint_16[2] 等价于 unsigned short[2]
char_array 等价于 char[2]
一般用这种方式,让自己的变量类型更容易理解


3. 二维数组定义

typedef int array[M][N]

array 等价于 int[M][N]


4. 函数声明定义

typedef int func(void);


func  等价于 int (void)类型函数

5. 函数指针定义

typedef int (*func)(void)

func 等价于int (*)(void)类型
func pfunc 等价于int (*pfunc)(void) 声明,pfunc是一个指向型如 int function(void) 声明的函数指针变量


PS:有人将typedef和#define混用,觉得typedef比#define好,并尽量用typedef代替#define,个人觉得这两个C语言的关键字是为了解决不同的事情,不能混在一起,从语法角度上,有些时候可能可以互相替换,但是如果你认同这种观点,我觉得是对这两个关键字的不理解,不是误用,是乱用。在理解这两个关键字的作用后,适当的,规矩的应用他们,会对代码质量有很大帮助,也能提高代码的优雅性。





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值