Is there any good way to do it

Discussion in 'C Programming' started by qianz99@gmail.com, Oct 12, 2005.

  1. Guest

    Hello I am writing a big program.

    I have define a struction

    typedef struct
    {
    int Name;
    int Year;
    }birth;

    Now I'd like to define a sequence of A, such as

    Birth A = {1,1990}
    Birth B = {1,1991}
    .....


    I hope to use #define so that A,B can be used as constant.
    Can I?
    and is it a good way of programming?

    Thanks
     
    , Oct 12, 2005
    #1
    1. Advertising

  2. In article <>,
    <> wrote:
    >I have define a struction


    >typedef struct
    >{
    > int Name;
    > int Year;
    >}birth;


    >Now I'd like to define a sequence of A, such as


    >Birth A = {1,1990}
    >Birth B = {1,1991}


    birth A = {1,1990};
    birth B = {1,1991};

    :I hope to use #define so that A,B can be used as constant.
    :Can I?

    No.

    What you can do is

    #define B90 {1,1990}
    #define B91 {1,1991}

    birth A = B90;
    birth B = B91;

    and use B90 or B91 wherever else in the code that you happen to need
    to initialize new variables to those values.

    But A and B will be writable. You cannot create an unwritable structure
    with any particular contents: the closest you can get is, as in the
    above, to define textual substituations that happen to expand to the
    values you need.

    You could also get fancier with functions that return const pointers
    to structures. You could probably even have something like

    const birth B90(void) { birth B90_temp = {1,1990}; return B90_temp; }

    but returning whole structures tends to make old-time programmers
    queasy.

    --
    Watch for our new, improved .signatures -- Wittier! Profounder! and
    with less than 2 grams of Trite!
     
    Walter Roberson, Oct 12, 2005
    #2
    1. Advertising

  3. -cnrc.gc.ca (Walter Roberson) writes:
    > In article <>,
    > <> wrote:
    >>I have define a struction

    >
    >>typedef struct
    >>{
    >> int Name;
    >> int Year;
    >>}birth;

    >
    >>Now I'd like to define a sequence of A, such as

    >
    >>Birth A = {1,1990}
    >>Birth B = {1,1991}

    >
    > birth A = {1,1990};
    > birth B = {1,1991};
    >
    > :I hope to use #define so that A,B can be used as constant.
    > :Can I?
    >
    > No.
    >
    > What you can do is
    >
    > #define B90 {1,1990}
    > #define B91 {1,1991}
    >
    > birth A = B90;
    > birth B = B91;
    >
    > and use B90 or B91 wherever else in the code that you happen to need
    > to initialize new variables to those values.


    Right, the {1,1990} construct can be used in an initializer, but it
    can't be used as an expression. C99 has compound literals, but
    they're not universally supported yet.

    > But A and B will be writable. You cannot create an unwritable structure
    > with any particular contents: the closest you can get is, as in the
    > above, to define textual substituations that happen to expand to the
    > values you need.


    Of course you can:

    const birth A = { 1, 1990 };
    const birth B = { 2, 1991 };

    A and B aren't true "constants"; they're best thought of as read-only
    variables. But they're probably suitable for the OP's purposes.

    --
    Keith Thompson (The_Other_Keith) <http://www.ghoti.net/~kst>
    San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
    We must do something. This is something. Therefore, we must do this.
     
    Keith Thompson, Oct 12, 2005
    #3
  4. Guest

    Walter Roberson wrote:
    > birth A = {1,1990};
    > birth B = {1,1991};
    >
    > :I hope to use #define so that A,B can be used as constant.
    > :Can I?
    >
    > No.


    The answer is correct for C89

    > birth A = B90;
    > birth B = B91;
    >
    > and use B90 or B91 wherever else in the code that you happen to need
    > to initialize new variables to those values.
    >
    > But A and B will be writable. You cannot create an unwritable structure
    > with any particular contents: the closest you can get is, as in the


    Actually, you can define const objects. Except for odd uses of strchr
    etc. or by use of casts, attempts to write to them always involves a
    constraint violation; in the exceptional cases, it invokes undefined
    behaviour. So, they are kind of unwritable.

    >
    > You could also get fancier with functions that return const pointers
    > to structures. You could probably even have something like
    >
    > const birth B90(void) { birth B90_temp = {1,1990}; return B90_temp; }


    A definition of a function type which is incompatible with birth(void),
    but which is functionally identical.

    >
    > but returning whole structures tends to make old-time programmers
    > queasy.
    >


    But using qualified values in C rather than qualified objects just to
    make someone queasy!
     
    , Oct 13, 2005
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. tsj
    Replies:
    4
    Views:
    780
  2. MNQ
    Replies:
    3
    Views:
    599
    Mike Treseler
    Oct 2, 2003
  3. mike
    Replies:
    3
    Views:
    313
  4. Eric Danstron

    Are there ANY good forums out there anymore???

    Eric Danstron, Sep 21, 2005, in forum: ASP General
    Replies:
    1
    Views:
    152
    Immediacy
    Sep 22, 2005
  5. Andries

    is there a way ..... any way

    Andries, Apr 26, 2004, in forum: Perl Misc
    Replies:
    27
    Views:
    254
    Robin
    Apr 27, 2004
Loading...

Share This Page