Pointers, typedef's and const's

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Alex

    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
  • Robert Gamble

    #2
    Re: Pointers, typedef's and const's

    On May 1, 5:00 pm, Alex <yakov...@hotma il.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.ht ml>.

    --
    Robert Gamble

    Comment

    • Andrey Tarasevich

      #3
      Re: Pointers, typedef's and const's

      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

      Comment

      • Alex

        #4
        Re: Pointers, typedef's and const's

        On May 1, 5:04 pm, Robert Gamble <rgambl...@gmai l.comwrote:
        On May 1, 5:00 pm, Alex <yakov...@hotma il.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.ht ml>.
        >
        --
        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 counterintuitiv e 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

        Comment

        • Andrey Tarasevich

          #5
          Re: Pointers, typedef's and const's

          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 counterintuitiv e to me.
          It looks counterintuitiv e 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

          Comment

          • Jack Klein

            #6
            Re: Pointers, typedef's and const's

            On Thu, 1 May 2008 14:00:46 -0700 (PDT), Alex <yakovlev@hotma il.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.l earn.c-c++

            Comment

            • Alex

              #7
              Re: Pointers, typedef's and const's

              On May 1, 10:17 pm, Jack Klein <jackkl...@spam cop.netwrote:
              On Thu, 1 May 2008 14:00:46 -0700 (PDT), Alex <yakov...@hotma il.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.l earn.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

              Comment

              • John Bode

                #8
                Re: Pointers, typedef's and const's

                On May 1, 4:00 pm, Alex <yakov...@hotma il.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.

                Comment

                Working...