Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.c > #65187

Re: Struct and Union

From Ben Bacarisse <ben.usenet@bsb.me.uk>
Newsgroups comp.lang.c
Subject Re: Struct and Union
Date 2015-07-10 21:48 +0100
Organization A noiseless patient Spider
Message-ID <87io9rwxgh.fsf@bsb.me.uk> (permalink)
References <a653fc98-5fae-48ff-ba1c-d7b53adee150@googlegroups.com>

Show all headers | View raw


janus <emekamicro@gmail.com> writes:

> I have 2 options but which one is idiomatic C?
>
> 1)
> typedef struct CStatement
> {
>     int stype;
>
>     union Statement
>     {
>         CPrintStatement* printstatement;
>         CInputStatement* inputstatement;
>         CAssignStatement* assignstatement;
>         CGotoStatement* gotostatement;
>         CIfThenStatement* ifthenstatement;
>         void* sstatement;
>
>     } statement;
> }CStatement;
>
>
> 2)
> typedef struct CStatement
> {
>     int stype;
>
>     void* sstatement;
>
> }CStatement;

I'd like to offer a third:

  typedef struct CStatement CStatement;

That's all that anyone usually sees, so you have to pass these things
around as pointers -- usually with a const on the target type.

Only in once place (one translation unit as C calls them, but it's C's
idea of a module) do you expand on this.  In that module, I'd use

  struct CStatement
  {
      int stype;
      void *statement;
  };

and provide a number of type-safe interface functions:

  void set_printstatement(CStatement *stmt, const CPrintStatement *cps)
  {
        stmt->stype = PRINT;
        stmt->statement = cps;
  }

  CPrintStatement *get_printstatement(const CStatement *stmt)
  {
        return stmt->stype == PRINT ? stmt->statement : NULL;
        /* Or do some other sort of error handling */
  }

There are a gazillion ways to make the definitions simpler to write and
maintain but I hope you get the drift.  The point is to hide this
implementation detail behind an opaque type.  You may be writing the
rest of the code so it might seem like you could simply impose on
yourself some good behaviour rules about access to this structure but I
find I like to keep myself out of the parts of my code where I don't
belong (most of the time).

-- 
Ben.

Back to comp.lang.c | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

Struct and Union janus <emekamicro@gmail.com> - 2015-07-10 00:49 -0700
  Re: Struct and Union Richard Heathfield <rjh@cpax.org.uk> - 2015-07-10 09:04 +0100
    Re: Struct and Union janus <emekamicro@gmail.com> - 2015-07-10 01:40 -0700
      Re: Struct and Union Richard Heathfield <rjh@cpax.org.uk> - 2015-07-10 09:50 +0100
        Re: Struct and Union Richard Heathfield <rjh@cpax.org.uk> - 2015-07-10 13:44 +0100
    Re: Struct and Union "Bill Davy" <Bill@SynectixLtd.com> - 2015-07-10 12:37 +0100
      Re: Struct and Union Keith Thompson <kst-u@mib.org> - 2015-07-10 08:24 -0700
        Re: Struct and Union Keith Thompson <kst-u@mib.org> - 2015-07-12 12:53 -0700
  Re: Struct and Union Ian Collins <ian-news@hotmail.com> - 2015-07-10 21:32 +1200
  Re: Struct and Union "Rick C. Hodgin" <rick.c.hodgin@gmail.com> - 2015-07-10 05:12 -0700
    Re: Struct and Union Ben Bacarisse <ben.usenet@bsb.me.uk> - 2015-07-10 17:35 +0100
      Re: Struct and Union David Kleinecke <dkleinecke@gmail.com> - 2015-07-10 10:18 -0700
        Re: Struct and Union "Rick C. Hodgin" <rick.c.hodgin@gmail.com> - 2015-07-10 10:23 -0700
        Re: Struct and Union James Kuyper <jameskuyper@verizon.net> - 2015-07-10 13:47 -0400
        Re: Struct and Union Keith Thompson <kst-u@mib.org> - 2015-07-10 12:38 -0700
      Re: Struct and Union "Rick C. Hodgin" <rick.c.hodgin@gmail.com> - 2015-07-10 10:27 -0700
  Re: Struct and Union Bartc <bc@freeuk.com> - 2015-07-10 13:55 +0100
  Re: Struct and Union Ben Bacarisse <ben.usenet@bsb.me.uk> - 2015-07-10 21:48 +0100
    Re: Struct and Union "Rick C. Hodgin" <rick.c.hodgin@gmail.com> - 2015-07-10 13:51 -0700
      Re: Struct and Union Ben Bacarisse <ben.usenet@bsb.me.uk> - 2015-07-10 23:45 +0100
        Re: Struct and Union "Rick C. Hodgin" <rick.c.hodgin@gmail.com> - 2015-07-10 17:43 -0700
          Re: Struct and Union Ben Bacarisse <ben.usenet@bsb.me.uk> - 2015-07-11 13:04 +0100
            Re: Struct and Union "Rick C. Hodgin" <rick.c.hodgin@gmail.com> - 2015-07-11 05:15 -0700
              Re: Struct and Union Bartc <bc@freeuk.com> - 2015-07-11 14:01 +0100
                Re: Struct and Union "Rick C. Hodgin" <rick.c.hodgin@gmail.com> - 2015-07-11 06:05 -0700
                Re: Struct and Union "Rick C. Hodgin" <rick.c.hodgin@gmail.com> - 2015-07-11 06:13 -0700
            Re: Struct and Union Keith Thompson <kst-u@mib.org> - 2015-07-11 13:51 -0700
              Re: Struct and Union Martin Shobe <martin.shobe@yahoo.com> - 2015-07-11 16:51 -0500
              Re: Struct and Union Ben Bacarisse <ben.usenet@bsb.me.uk> - 2015-07-11 23:13 +0100
                Re: Struct and Union Keith Thompson <kst-u@mib.org> - 2015-07-11 17:39 -0700
              Re: Struct and Union Malcolm McLean <malcolm.mclean5@btinternet.com> - 2015-07-11 16:56 -0700
  Re: Struct and Union Malcolm McLean <malcolm.mclean5@btinternet.com> - 2015-07-10 18:52 -0700
  Re: Struct and Union Tim Rentsch <txr@alumni.caltech.edu> - 2015-07-10 19:12 -0700

csiph-web