如何提高C语言代码质量?(十四)

typedef使用示例,如下面的代码所示:海风教育投诉

海风教育在线辅导0元一对一试听课等你来领取,领取课程方法:
1、私信留下您的手机号和姓名,需要补习的科目。
2、也可以在海风教育官网留下您的手机号领取 https://www.hfjy.com

typedef char* PCHAR;
int strcmp(const PCHAR,const PCHAR) ;

在上面的代码中,“const PCHAR"是否相当于“const char*“呢?
答案是否定的,原因很简单,typedef是用来定义一种类型的新别名的,它不同于宏,不是简单的字符串替换。因此,“const PCHAR”中的const给予了整个指针本身常量性,也就是形成了常量指针“char* const (一个指向char的常量指针)”。即它实际上相当于“charconst",而不是“const char * (指向常量char的指针)"。当然,要想让const PCHAR相当于const char也很容易,如下面的代码所示:

typedef const char* PCHAR;
int strcmp (PCHAR,PCHAR) ;

其实,无论什么时候,只要为指针声明typedef,那么就应该在最终的typedef 名称中加一个const,以使得该指针本身是常量。
还需要特别注意的是,虽然typedef并不真正影响对象的存储特性,但在语法上它还是一个存储类的关键字,就像auto. extern. static 和register等关键字-样。因此,像下面这种声明方式是不可行的:

typedef static int INT_ STATIC;

不可行的原因是不能声明多个存储类关键字,由于typedef已经占据了存储类关键字的位置,因此,在typedef声明中就不能够再使用static 或任何其他存储类关键字了。当然,编译器也会报错,如在VC++ 2010中的报错信息为“无法指定多个存储类"。

typedef不同于#define

前面已经特别强调过,typedef是用来定义一种类型的新别名的,它不同于宏( #define),不是简单的字符串替换。它的新名字具有一定的封装性,所以新命名的标识符具有更易定义变量的功能,它是语言编译过程的一部分,但它并不实际分配内存空间。
而#define只是简单的字符串替换(原地扩展),它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经完成了。因此,它不会做正确性检查,不管含义是否正确它照样会带人,只有在编译已被展开的源程序时才会发现可能的错误并报错。

在定义上述的变量时,cl,c2与c3按照预期都被定义成char类型。值得注意的是,c4却被定义成char类型,而不是我们所预期的char。其根本原因就在于#define只是简单的字符串替换,而typedef则是为一个类型引人一个新的别名。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值