typedef指针const怪异

请考虑以下代码:


typedef struct Person* PersonRef;

struct Person {

  int age;

};


const PersonRef person = NULL;


void changePerson(PersonRef newPerson) {

  person = newPerson;

}

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


慕妹3242003
浏览 491回答 3
3回答

MM们

注意typedef int* intptr;const intptr x;与以下内容不同:const int* x;intptr是指向int的指针。const intptr是指向常量的指针int,而不是指向常量的指针int。所以,在typedef指针之后,我不能再将其常量化为内容了吗?有一些丑陋的方法,例如gcc的typeof宏:typedef int* intptr;intptr dummy;const typeof(*dummy) *x;但是,如您所见,知道后面的类型是没有意义的intptr。

BIG阳

虽然以上答案已经解决了问题,但我确实想念为什么...因此,也许是一个经验法则:将const总是指它的前身令牌。如果没有这种情况,它是“ consting”它是后继令牌。该规则确实可以帮助您声明一个指向const指针的指针或类似的东西。无论如何,考虑到这一点,应该弄清楚为什么struct Person *const person = NULL;声明一个指向可变结构的const指针。考虑一下,您的typedef 使用指针标记将“分组”。所以,写struct Person*const PersonRef person = NULL;您的编译器会看到以下内容(伪代码):const [struct Person *]person = NULL;由于的内容已不const剩,因此它将令牌标记为正确的struct Person *常量。好吧,我认为,这就是为什么我不喜欢使用typedef隐藏指针的原因,而我确实喜欢typedef。那写作呢typedef struct Person { ... } Person;const Person *person; /*< const person */Person *const pointer; /*< const pointer to mutable person */对于编译器和人员来说,您应该做什么很清楚。

开心每一天1111

永远不要将指针隐藏在typedef后面,这确实是一种糟糕的做法,只会造成bug。此类臭名昭著的错误是,声明为const的typedef:ed指针类型将被视为“指向非常量数据的常量指针”,而不是“直观地希望指向常量数据的非常量指针”。 。这就是程序中发生的情况。解:typedef struct{&nbsp; int age;} Person;const Person* person = NULL; // non-constant pointer to constant Person
打开App,查看更多内容
随时随地看视频慕课网APP