typedef指针常量古怪

请考虑下面的代码:

typedef struct Person* PersonRef; struct Person { int age; }; const PersonRef person = NULL; void changePerson(PersonRef newPerson) { person = newPerson; } 

出于某种原因,编译器正在关于只读值不可分配。 但const关键字不应该使指针为const。 有任何想法吗?

注意

 typedef int* intptr; const intptr x; 

不一样:

 const int* x; 

intptr是指向int的指针。 const intptr是指向int常量指针,而不是指向常量int指针。

所以,在一个typedef指针后,我不能使它对内容不再是const?

有一些丑陋的方式,例如海湾合作委员会的types的macros :

 typedef int* intptr; intptr dummy; const typeof(*dummy) *x; 

但是,正如你所看到的,如果你知道intptr后面的types是没有意义的。

 const PersonRef person = NULL; 

 struct Person*const person= NULL; 

所以你正在指针而不是对象。

虽然这个问题已经被上面的答案解决了,但是我错过了为什么…

所以也许作为一个经验法则:

  1. const总是指它的前驱令牌。
  2. 如果没有这样的情况,那就是“强制”它的后继标记。

这个规则可以真正帮助你声明一个指向const指针的指针或者其他一些东西。

无论如何,考虑到这一点,它应该清楚为什么

 struct Person *const person = NULL; 

声明一个可变结构的const指针

想想看,你的typedef用指针标记“ * ”来分组 struct Person 。 所以,写作

 const PersonRef person = NULL; 

你的编译器看到这样的东西(伪代码):

 const [struct Person *]person = NULL; 

因为没有什么东西是左边的,所以令牌令牌正确的struct Person *常量。

那么我认为,这就是为什么我不喜欢通过typedefs隐藏指针,而我喜欢typedefs这样的。 写什么呢

 typedef struct Person { ... } Person; const Person *person; /*< const person */ Person *const pointer; /*< const pointer to mutable person */ 

编译器和人类应该很清楚,你在干什么。

永远不要在typedef背后隐藏指针,这实际上是非常糟糕的做法,只会产生错误。

其中一个臭名昭着的错误是,被声明为const的typedef:ed指针types将被视为“指向非常量数据的常量指针”,而不是“常量数据的非常量指针”,这是人们直观的预期。 这是你的程序中发生的事情。


解:

 typedef struct { int age; } Person; const Person* person = NULL; // non-constant pointer to constant Person 

你越来越错误

 error: assignment of read-only variable 'person' 

在声明上

 person = newPerson; 

因为你已经声明人为const,所以它的值只能被读取…. const值不能被改变

如果你要改变那个vatiable那么你为什么要保持它的const?

删除const关键字您的代码将正常工作