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似乎造成了比它解决的更多麻烦......可能不是最好的主意.