typedef'ng指针和const

San*_*996 8 c pointers typedef const

我正在看一个例子,它表明为什么typedef'ng指针是一种不好的做法.我对该示例不了解的部分是为什么编译器无法捕获问题.我在下面的代码中详细说明了这个例子:

#include <stdio.h>

typedef int *TYPE; 

void set_type(TYPE t) {
    *t = 12;
}

void foo(const TYPE mytype) {   
    set_type(mytype);  // Error expected, but in fact compiles 
}

int main() {   
    TYPE a;
    int b = 10;
    a = &b;
    printf("A is %d\n",*a);
    foo(a);
    printf("A is %d\n",*a);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

所以,我能够改变它的价值a.即使这个例子解释了你必须要typedef const int *TYPE解决这个问题,我也不明白为什么编译器在设置TYPE to be const函数参数本身时无法捕获错误.我确信我遗漏了一些非常基本的东西.

Dao*_*Wen 13

这里的问题是对const应用于什么的混淆:它是应用于指针值本身,还是应用于指向的值?

const TYPE x是说指针值应该是常量.这大致相当于int * const x.请注意,以下代码确实会导致错误:

int b = 10;
const TYPE p = NULL;
p = &b; // error here (assign to const)
Run Code Online (Sandbox Code Playgroud)

你期待的是const int * x,它使x指向的值成为常数.

由于typedef隐藏了TYPE一个指针类型的事实,除了声明另一个typedef之外,没有办法指定指向的东西TYPE应该是const:

typedef const int * CONST_TYPE;
Run Code Online (Sandbox Code Playgroud)

然而,在这一点上,typedef似乎造成了比它解决的更多麻烦......可能不是最好的主意.