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;
所以你正在指针而不是对象。
虽然这个问题已经被上面的答案解决了,但是我错过了为什么…
所以也许作为一个经验法则:
-
const
总是指它的前驱令牌。 - 如果没有这样的情况,那就是“强制”它的后继标记。
这个规则可以真正帮助你声明一个指向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关键字您的代码将正常工作