关于typedef指针类型后的非主流const行为(misc-misplaced-const)

这是一个之前没怎么注意过的细节问题,首先,参加如下代码:

struct MyStruct
{
    int type;
    char name[40];
};

typedef MyStruct * PMyStruct;

int main(int argc, char * argv[])
{
    MyStruct my1{0}, my2{0};
    const MyStruct * pmy1 = &my1;
    pmy1 = &my2;
    const PMyStruct pmy2 = &my1;
    pmy2 = &my2;
}

很简单的一段代码,但是全引出了一个不寻常的问题:此段代码编译时,第二个pmy2结构体指针会导致编译器(gcc)报错:“error: assignment of read-only variable ‘pmy2’”,此时如果配合有clang-tidy之类的代码扫描工具,会发现pmy2声明赋值位置提示:“Clang-Tidy: ‘pmy2’ declared with a const-qualified typedef; results in the type being ‘MyStruct *const’ instead of ‘const MyStruct *’”(clang-tidy的misc-misplaced-const)!

配合编译器错误和clang-tidy的提示,不难看出“const PMyStruct”并不等同于“const MyStruct *”,而是等同于“MyStruct * const”也就是说是常量指针而不是指向常量的指针,因此不可在初始化赋值后改变指针变量指向!

其实为何会如此博主我也不太清楚,可能是标准(设计)如此?不过经过搜索后找到了此篇文章提到了同样的问题:https://stackoverflow.com/questions/8504411/typedef-pointer-const-weirdness,读了下,发现虽然不是什么多严重的问题,但还是引发了不少讨论,其中也有提到一些靠骚操作做到用typedef指针变量声明指向常量的指针变量:

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

但更多的说法还是尽量避免使用typedef指针类型!

博主友情提示:

如您在评论中需要提及如QQ号、电子邮件地址或其他隐私敏感信息,欢迎使用>>博主专用加密工具v3<<处理后发布,原文只有博主可以看到。