470,849 Members | 1,033 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 470,849 developers. It's quick & easy.

Pointers, typedef's and const's

The code below can't be compiled:

typedef char* POINTER;
const POINTER ptr;
ptr++;

The compiler (Sun C 5.8 Patch 121015-04 2007/01/10) complains:

"test.c", line ...: operand must be modifiable lvalue: op "++"

It looks like the "const POINTER" has been compiled to "char* const".
A question is - why?

Best wishes,
Alex
Jun 27 '08 #1
7 1811
On May 1, 5:00 pm, Alex <yakov...@hotmail.comwrote:
The code below can't be compiled:

typedef char* POINTER;
const POINTER ptr;
ptr++;

The compiler (Sun C 5.8 Patch 121015-04 2007/01/10) complains:

"test.c", line ...: operand must be modifiable lvalue: op "++"

It looks like the "const POINTER" has been compiled to "char* const".
A question is - why?

Best wishes,
Alex
<http://c-faq.com/Question 11.11, <http://c-faq.com/ansi/
typedefconst.html>.

--
Robert Gamble

Jun 27 '08 #2
Alex wrote:
The code below can't be compiled:

typedef char* POINTER;
const POINTER ptr;
ptr++;

The compiler (Sun C 5.8 Patch 121015-04 2007/01/10) complains:

"test.c", line ...: operand must be modifiable lvalue: op "++"

It looks like the "const POINTER" has been compiled to "char* const".
A question is - why?
Why not???

--
Best regards,
Andrey Tarasevich
Jun 27 '08 #3
On May 1, 5:04 pm, Robert Gamble <rgambl...@gmail.comwrote:
On May 1, 5:00 pm, Alex <yakov...@hotmail.comwrote:
The code below can't be compiled:
typedef char* POINTER;
const POINTER ptr;
ptr++;
The compiler (Sun C 5.8 Patch 121015-04 2007/01/10) complains:
"test.c", line ...: operand must be modifiable lvalue: op "++"
It looks like the "const POINTER" has been compiled to "char* const".
A question is - why?
Best wishes,
Alex

<http://c-faq.com/Question 11.11, <http://c-faq.com/ansi/
typedefconst.html>.

--
Robert Gamble
Robert, thanks

From the FAQ 11.11: "The typedef'ed declaration of p does not ``look
inside'' the typedef to see that there is a pointer involved."

So meanings of "const POINTER" and "POINTER const" are the same... It
looks counterintuitive to me.

Do you know any reason, why it has been done this way? Was it too
difficult to look inside the typedef? I don't think so - pointer
dereferencing works, right?

Best wishes,
Alex
Jun 27 '08 #4
Alex wrote:
>
From the FAQ 11.11: "The typedef'ed declaration of p does not ``look
inside'' the typedef to see that there is a pointer involved."

So meanings of "const POINTER" and "POINTER const" are the same... It
looks counterintuitive to me.
It looks counterintuitive to you probably because you think of
typedef-names as macros, while in reality they are not macros, but
alternative names for types.

Meaning of "const POINTER" and "POINTER const" is the same just like the
meaning of "const int" is the same as that of "int const".

The current behavior qualifiers applied to typedef-names is perfectly
intuitive, once you get the proper understanding of what typedef-names are.
Do you know any reason, why it has been done this way? Was it too
difficult to look inside the typedef?
The real question in this case is why would anyone even want to "look
inside the typedef" as you suggest.

--
Best regards,
Andrey Tarasevich
Jun 27 '08 #5
On Thu, 1 May 2008 14:00:46 -0700 (PDT), Alex <ya******@hotmail.com>
wrote in comp.lang.c:
The code below can't be compiled:

typedef char* POINTER;
const POINTER ptr;
ptr++;

The compiler (Sun C 5.8 Patch 121015-04 2007/01/10) complains:

"test.c", line ...: operand must be modifiable lvalue: op "++"

It looks like the "const POINTER" has been compiled to "char* const".
A question is - why?

Best wishes,
Alex
That is just one of the reasons why hiding a pointer in a typedef is a
mistake in 99% of the cases where you see it.

Why do you want to use a typedef instead of using "char *"? What do
you think that you gain?

--
Jack Klein
Home: http://JK-Technology.Com
FAQs for
comp.lang.c http://c-faq.com/
comp.lang.c++ http://www.parashift.com/c++-faq-lite/
alt.comp.lang.learn.c-c++
http://www.club.cc.cmu.edu/~ajo/docs/FAQ-acllc.html
Jun 27 '08 #6
On May 1, 10:17 pm, Jack Klein <jackkl...@spamcop.netwrote:
On Thu, 1 May 2008 14:00:46 -0700 (PDT), Alex <yakov...@hotmail.com>
wrote in comp.lang.c:
The code below can't be compiled:
typedef char* POINTER;
const POINTER ptr;
ptr++;
The compiler (Sun C 5.8 Patch 121015-04 2007/01/10) complains:
"test.c", line ...: operand must be modifiable lvalue: op "++"
It looks like the "const POINTER" has been compiled to "char* const".
A question is - why?
Best wishes,
Alex

That is just one of the reasons why hiding a pointer in a typedef is a
mistake in 99% of the cases where you see it.

Why do you want to use a typedef instead of using "char *"? What do
you think that you gain?

--
Jack Klein
Home:http://JK-Technology.Com
FAQs for
comp.lang.chttp://c-faq.com/
comp.lang.c++http://www.parashift.com/c++-faq-lite/
alt.comp.lang.learn.c-c++http://www.club.cc.cmu.edu/~ajo/docs/FAQ-acllc.html
Well, I don't use a typedef instead of "char *". I just was annoyed by
chains of asterisks, caused by "pointer to pointer to pointer"
declarations and tried to improve my code readability.

I tend to consider typedef's as user-defined types - that's why I
never write "char *ch", but "char* ch" instead (and I don't declare
many variables in one statement). I expected my new types to behave
like predefined types, including a possibility to "constanize" them.
May be, this two-face functionality of "const" for pointers is a real
evil here. I'd prefer to write something like this:

(const char)* const ptr;

But it's not C - right? I like the "const" keyword and use it A LOT,
so one more heretical thought - all the variables should be "const" by
default, and if you need a non-const variable, you'll have to declare
that fact with some keyword.

Best wishes,
Alex
Jun 27 '08 #7
On May 1, 4:00 pm, Alex <yakov...@hotmail.comwrote:
The code below can't be compiled:

typedef char* POINTER;
const POINTER ptr;
ptr++;

The compiler (Sun C 5.8 Patch 121015-04 2007/01/10) complains:

"test.c", line ...: operand must be modifiable lvalue: op "++"

It looks like the "const POINTER" has been compiled to "char* const".
A question is - why?

Best wishes,
Alex
Because you've created a synonym for a pointer type, and you're
applying the const qualifier to the synonym; i.e., you've said you
want the pointer value to be constant, not the thing being pointed
to.
Jun 27 '08 #8

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

2 posts views Thread by Thomas Matthews | last post: by
8 posts views Thread by Amit | last post: by
7 posts views Thread by Frank M. | last post: by
3 posts views Thread by Thomas Nelson | last post: by
1 post views Thread by Bushido Hacks | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.