Hello all,
It is common to have structures which end with an "undefined"
variable-length array like
struct foo_st {
struct bar_st* someptr;
int len;
struct biz_st *tab[] /* actual size is len */;
};
I'm sorry to be unable to get the exact wording of this construct,
which I am sure is in some recent (C99? maybe) standard, unfortunately
I don't have these standards at hand.
There is even a length attribute in GTY to help support this
http://gcc.gnu.org/onlinedocs/gccint/GTY-Options.html
I believe the correct idiom in GCC source is to put an explicit
dimension to 1 (probably because 0 would make some old compilers
unhappy), ie to code instead
struct foo_st {
struct bar_st* someptr;
int len;
struct biz_st *tab[1] /* 1 is dummy, actual size is len */;
};
Unfortunately, when debugging (or taking sizeof), this makes a little
difference.
My small suggestion would be
1. To explicitly document that such undefined variable-sized array
fields should be declared of dimension VARYING_SIZE (or some other
word), i.e. to code
struct foo_st {
struct bar_st* someptr;
int len;
struct biz_st *tab[VARYING_SIZE] /* actual size is len */;
};
2. To have a definition of VARYING_SIZE is some of our header files
(config.h, or system.h or others) which is 1 for old compilers and
empty for new ones (including gcc itself), maybe
#if (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L)
#define VARYING_SIZE 1
#else
#define VARYING_SIZE /*empty*/
#endif
Is there some point that I forgot? Probably yes, since my suggestion
is quite obvious but not yet in GCC?
Thanks for reading.
--
Basile STARYNKEVITCH http://starynkevitch.net/Basile/
email: basile<at>starynkevitch<dot>net mobile: +33 6 8501 2359
8, rue de la Faïencerie, 92340 Bourg La Reine, France
*** opinions {are only mines, sont seulement les miennes} ***