由一个typedef问题引发的思考

百度百科中的typedef
https://baike.baidu.com/item/typedef/9558154?fr=aladdin
同样,可以像下面这样隐藏指针语法:

typedef char* pstr;

int mystrcmp(const pstr p1,const pstr p3);

用GNU的gcc和g++编译器,是会出现警告的,按照顺序,“const pstr”被解释为“char* const”(一个指向char的指针常量),而事实上,const char和char const表达的并非同一意思,const char的意思是创建一个指向char类型的指针且不能更改指向地址上的值,而char const则是不能更改指向的地址;

char* const p : 定义一个指向字符的指针常数,即const指针,常量指针。
const char* p :定义一个指向字符型常量的指针。

typedef的用法和相关问题
下面的代码中编译器会报一个错误,你知道是哪个语句错了吗?

typedef char *pStr;
char string[4]="abc";
const char *p1=string;
const pStr p2=string;
p1++;
p2++;

答案与分析:
是p2++出错了。
这个问题再一次提醒我们:typedef和#define不同,它不是简单的文本替换。上述代码中const pStr p2并不等于const char * p2。const pStr p2和pStr const p2本质上没有区别,都是对变量进行只读限制,只不过此处变量p2的数据类型是我们自己定义的而不是系统固有类型而已。因此,const pStr p2的含义是:限定数据类型为char *的变量p2为只读,因此p2++错误。

然后去编译器中求证:

这是在Mingw7.3编译器,基于gcc的
在这里插入图片描述

vs2017编译器中:
在这里插入图片描述

由此引发了我们的一个思考:编译器将
typedef char* pStr;
const pStr p2;
处理后得到的是pStr const p2; 即char *const p2;
为什么?

继续查资料:
c++的const总结(转)
终于看到了线索:

const int a=5;int const a=5; 等同
类名 const 对象名 与 const 类名 对象名 等同

这与指针不同,

char *const cp; //到char的const指针
char const *pc1; //到const char的指针
const char *pc2; //到const char的指针(后两个声明是等同的)

typedef char* pStr;是定义了一个新的类型pStr,而编译器不把pStr当做是char指针看待,而是将其看做一个新的类型。
const int a=5; 与 int const a=5; 等同
那么在编译器看来:
const pStr p;和pStr const p;等同
pStr const p;再展开就是char
const p;了
至此解释通了。
大胆猜测

const int a=5;int const a=5; 等同
类名 const 对象名 与 const 类名 对象名 等同

编译器应该是统一处理成:
类名 const 对象名
即:
int const a=5;
pStr const p;

指针类型的预处理规则应该是另外一套规则了。

参考资料:
typedef(百度百科)
typedef的用法和相关问题
c++的const总结(转)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值