problem about const member in a struct

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

    problem about const member in a struct

    Hi everyone, I have a problem. If I declare a struct with a const
    member, what will happen?For example:
    if I declared a struct like following:
    struct{
    const int a;
    char c;
    }aStruct;
    then such statement as
    aStruct.a = 0;
    is illegal.
    But I can printf the value of a, it's always the same value no matter
    how many times I recompile the program. I'm wondering about how can
    the compiler ascertain the value of the const member?
    In an application, I wanna define a struct, whose first member is a
    const and its value is given by me, how can I do that? Neither K&R
    book nor "C: A Reference manual" mention this problem. Does anyone
    know? Thanx ^_^
  • Ian Collins

    #2
    Re: problem about const member in a struct

    Gestorm wrote:
    Hi everyone, I have a problem. If I declare a struct with a const
    member, what will happen?For example:
    if I declared a struct like following:
    struct{
    const int a;
    char c;
    }aStruct;
    then such statement as
    aStruct.a = 0;
    is illegal.
    But I can printf the value of a, it's always the same value no matter
    how many times I recompile the program. I'm wondering about how can
    the compiler ascertain the value of the const member?
    It can be initialised:

    struct{
    const int a;
    char c;
    } aStruct = { 42,'a' };
    In an application, I wanna define a struct, whose first member is a
    const and its value is given by me, how can I do that? Neither K&R
    book nor "C: A Reference manual" mention this problem. Does anyone
    know? Thanx ^_^
    Make the struct a type:

    struct X {
    const int a;
    char c;
    };

    Then you can use one:

    void f( int n )
    {
    struct X x = { n };
    x.c = 'n';
    }

    --
    Ian Collins.

    Comment

    • Keith Thompson

      #3
      Re: problem about const member in a struct

      Gestorm <zhcfreesea@126 .comwrites:
      Hi everyone, I have a problem. If I declare a struct with a const
      member, what will happen?For example:
      if I declared a struct like following:
      struct{
      const int a;
      char c;
      }aStruct;
      then such statement as
      aStruct.a = 0;
      is illegal.
      But I can printf the value of a, it's always the same value no matter
      how many times I recompile the program. I'm wondering about how can
      the compiler ascertain the value of the const member?
      In an application, I wanna define a struct, whose first member is a
      const and its value is given by me, how can I do that? Neither K&R
      book nor "C: A Reference manual" mention this problem. Does anyone
      know? Thanx ^_^
      An object declared as "const" has the value given to it when it's
      initialized. That value cannot legally be changed later by an
      assignment.

      You didn't tell us where you declared "aStruct". It's (almost) always
      best to post a complete compilable program that demonstrates your
      point.

      If aStruct is declared outside any function, or with the "static"
      keyword, then the initial value of aStruct.a will be 0. If it's
      declared inside a function with no "static" keyword, its initial value
      will be garbage, and you won't be able to assign a valid value. (It's
      not unlikely that the garbage will happen to be 0, but don't depend on
      it.)

      Applying "const" to members of struct actually isn't very common in my
      experience. But here's a small program that might suggest how it
      could be useful:

      #include <stdio.h>

      struct person {
      const int birth_year;
      int current_age;
      };

      int main(void)
      {
      struct person fred = { 1970, 38 };
      printf("fred.bi rth_year = %d, fred.current_ag e = %d\n",
      fred.birth_year , fred.current_ag e);
      /* Can't change fred.birth_year */
      fred.current_ag e ++;
      printf("fred.bi rth_year = %d, fred.current_ag e = %d\n",
      fred.birth_year , fred.current_ag e);
      return 0;
      }

      birth_year must be set when the person object is created, and cannot
      be changed thereafter. current_age can change over time.

      (A flaw in this is that C lets you get away with *not* initializing
      birth_year; if you don't initialize it, you can't set it later.)

      --
      Keith Thompson (The_Other_Keit h) kst-u@mib.org <http://www.ghoti.net/~kst>
      Nokia
      "We must do something. This is something. Therefore, we must do this."
      -- Antony Jay and Jonathan Lynn, "Yes Minister"

      Comment

      • Gestorm

        #4
        Re: problem about const member in a struct

        It can be initialised:
        >
        struct{
        const int a;
        char c;
        >
        } aStruct = { 42,'a' };
        Make the struct a type:
        >
        struct X {
        const int a;
        char c;
        >
        };
        >
        Ian Collins.
        I understand, thank you very much!

        Comment

        • Gestorm

          #5
          Re: problem about const member in a struct

          You didn't tell us where you declared "aStruct". It's (almost) always
          best to post a complete compilable program that demonstrates your
          point.
          >
          Sorry! I would take notice next time!
          >
          Applying "const" to members of struct actually isn't very common in my
          experience. But here's a small program that might suggest how it
          could be useful:
          >
          #include <stdio.h>
          >
          struct person {
          const int birth_year;
          int current_age;
          >
          };
          >
          int main(void)
          {
          struct person fred = { 1970, 38 };
          printf("fred.bi rth_year = %d, fred.current_ag e = %d\n",
          fred.birth_year , fred.current_ag e);
          /* Can't change fred.birth_year */
          fred.current_ag e ++;
          printf("fred.bi rth_year = %d, fred.current_ag e = %d\n",
          fred.birth_year , fred.current_ag e);
          return 0;
          >
          }
          >
          birth_year must be set when the person object is created, and cannot
          be changed thereafter. current_age can change over time.
          >
          (A flaw in this is that C lets you get away with *not* initializing
          birth_year; if you don't initialize it, you can't set it later.)
          >
          Very clearly thanx a lot!

          Comment

          • Keith Thompson

            #6
            Re: problem about const member in a struct

            Gestorm <zhcfreesea@126 .comwrites:
            >You didn't tell us where you declared "aStruct". It's (almost) always
            >best to post a complete compilable program that demonstrates your
            >point.
            >>
            Sorry! I would take notice next time!
            I wrote the above, starting with "You didn't tell us ...". Your
            newsreader, or in this case the Google Groups interface, automatically
            adds an attribution line, such as "Gestorm <zhcfreesea@126 .com>
            writes:" above. Please don't delete it. It helps keep track of who
            said what, and it's just polite to give credit when quoting someone
            else's words.

            It's also rarely necessary to quote an entire article when posting a
            followup. Trim quoted material to just what's relevant.

            --
            Keith Thompson (The_Other_Keit h) kst-u@mib.org <http://www.ghoti.net/~kst>
            Nokia
            "We must do something. This is something. Therefore, we must do this."
            -- Antony Jay and Jonathan Lynn, "Yes Minister"

            Comment

            • Gestorm

              #7
              Re: problem about const member in a struct

              On 6ÔÂ14ÈÕ, ÏÂÎç11ʱ23·Ö, Keith Thompson <ks...@mib.orgw rote:
              I wrote the above, starting with "You didn't tell us ...". Your
              newsreader, or in this case the Google Groups interface, automatically
              adds an attribution line, such as "Gestorm <zhcfree...@126 .com>
              writes:" above. Please don't delete it. It helps keep track of who
              said what, and it's just polite to give credit when quoting someone
              else's words.
              >
              It's also rarely necessary to quote an entire article when posting a
              followup. Trim quoted material to just what's relevant.
              >
              OK! I'm a newer. Thanks for telling me those rules!^_^

              Comment

              Working...