I was looking at an example which showed that why typedef'ng a pointer is a bad practice. The part I didn't understand about the example is that why the compiler wasn't able to catch the problem. I elaborated the example into the following code:
#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;
}
So, I was able to change the value of a
. Even though, the example explained that you would have to do, typedef const int *TYPE
, to solve the problem, I dont understand why the compiler was not able to catch the error when I am setting TYPE to be const
in the function argument itself. I am sure I am missing something very basic.
The issue here is confusion about what const
is being applied to: is it applied to the pointer value itself, or the value being pointed to?
const TYPE x
is saying that the pointer value should be constant. This is roughly equivalent to int * const x
. Note that the following code does result in an error:
int b = 10;
const TYPE p = NULL;
p = &b; // error here (assign to const)
What you were expecting is const int * x
, which makes the value pointed to by x a constant.
Since the typedef hides the fact that TYPE
is a pointer type, there's no way to specify that the thing pointed to by TYPE
should be const
, aside from declaring another typedef:
typedef const int * CONST_TYPE;
However, at this point the typedef seems to be causing more trouble than it solves... Probably not the best idea.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With