home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #16 / NN_1992_16.iso / spool / comp / lang / c / 11611 < prev    next >
Encoding:
Internet Message Format  |  1992-07-25  |  1.9 KB

  1. Path: sparky!uunet!sun-barr!ames!agate!dog.ee.lbl.gov!horse.ee.lbl.gov!torek
  2. From: torek@horse.ee.lbl.gov (Chris Torek)
  3. Newsgroups: comp.lang.c
  4. Subject: Re: initiaklizing union members
  5. Date: 26 Jul 1992 01:58:00 GMT
  6. Organization: Lawrence Berkeley Laboratory, Berkeley
  7. Lines: 57
  8. Distribution: usa
  9. Message-ID: <24901@dog.ee.lbl.gov>
  10. References: <1708@toro.MTS.ML.COM> <5391@dsacg3.dsac.dla.mil>
  11. Reply-To: torek@horse.ee.lbl.gov (Chris Torek)
  12. NNTP-Posting-Host: 128.3.112.15
  13.  
  14. In article <1708@toro.MTS.ML.COM> scott@toro.MTS.ML.COM (Scott Strool)
  15. writes:
  16. [given]
  17. >>struct Row {
  18. >>    int Type;
  19. >>    union {
  20. >>        int ival;
  21. >>        char *sval;
  22. >>    } value;
  23. >>};
  24.  
  25. >>how would i set value with a static declaration:
  26. >> 
  27. >>static Row r0 = { 0, 1234 };
  28. >>static Row r1 = { 1, "string" };
  29.  
  30. In article <5391@dsacg3.dsac.dla.mil> nto0302@dsacg3.dsac.dla.mil
  31. (Bob Fisher) writes:
  32. >I don't know if this is a compiler problem or a syntax problem.  I
  33. >suggest that you try initializing Row r1 with a pointer, not a string.
  34. >If that doesn't help, try placing int Type after the union.  The union
  35. >may or may not be aligning on a word boundary.
  36.  
  37. None of these suggestions are even close.
  38.  
  39. In ANSI C, only the initializer for r0 is legal.  Unions may be
  40. initialized, but only via the first member.  There is no way to
  41. select some other member in an initializer.
  42.  
  43. In Classic C, the situation is even worse:  Unions can NEVER be
  44. initialized.
  45.  
  46. If you have an ANSI C compiler, you can get away with this:
  47.  
  48.     struct Row {
  49.         int    Type;
  50.         union {
  51.             int    ival;
  52.             char    *sval;
  53.         } value;
  54.     };
  55.     struct Row_str {
  56.         int    Type;
  57.         union {
  58.             char    *sval;
  59.             int    ival;
  60.         } value;
  61.     };
  62.     static Row r0 = { 0, 1234 };
  63.     static Row_str r1_str = { 1, "string" };
  64.     #define    r1 (*(struct Row *)&r1_str)
  65.  
  66. If you have a Classic C compiler ... forget it.  Use runtime
  67. initializers.
  68. -- 
  69. In-Real-Life: Chris Torek, Lawrence Berkeley Lab CSE/EE (+1 510 486 5427)
  70. Berkeley, CA        Domain:    torek@ee.lbl.gov
  71.