Jan Kok wrote:

> a) who says member names can begin with "."?  I don't see it in The C 
> Programming Language, 2nd Ed. by K&R, and I don't see it in the 
> extensions listed in the gcc documentation (although it mentions that 
> "$" is allowed as an extension).
> 
> b) I also don't see where <member>=<value> is allowed for 
> initialization.  The standard way is { <value>, <value>...}
> 
>  
> 
> static struct stream rom_stream __stream = {
> .init = init_bytes,
> .read = read_bytes,
> 

In "info gcc"

Next: Cast to Union,  Prev: Constructors,  Up: C Extensions

Labeled Elements in Initializers
================================

    Standard C requires the elements of an initializer to appear in a
fixed order, the same as the order of the elements in the array or
structure being initialized.

    In GNU C you can give the elements in any order, specifying the array
indices or structure field names they apply to.  This extension is not
implemented in GNU C++.

    To specify an array index, write `[INDEX]' or `[INDEX] =' before the
element value.  For example,

      int a[6] = { [4] 29, [2] = 15 };

is equivalent to

      int a[6] = { 0, 0, 15, 0, 29, 0 };

The index values must be constant expressions, even if the array being
initialized is automatic.

    To initialize a range of elements to the same value, write `[FIRST
... LAST] = VALUE'.  For example,

      int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };

Note that the length of the array is the highest value specified plus
one.

    In a structure initializer, specify the name of a field to initialize
with `FIELDNAME:' before the element value.  For example, given the
following structure,

      struct point { int x, y; };

the following initialization

      struct point p = { y: yvalue, x: xvalue };

is equivalent to

      struct point p = { xvalue, yvalue };

    Another syntax which has the same meaning is `.FIELDNAME ='., as
shown here:

      struct point p = { .y = yvalue, .x = xvalue };

    You can also use an element label (with either the colon syntax or
the period-equal syntax) when initializing a union, to specify which
element of the union should be used.  For example,

      union foo { int i; double d; };

      union foo f = { d: 4 };

will convert 4 to a `double' to store it in the union using the second
element.  By contrast, casting 4 to type `union foo' would store it
into the union as the integer `i', since it is an integer.  (*Note Cast
to Union::.)

    You can combine this technique of naming elements with ordinary C
initialization of successive elements.  Each initializer element that
does not have a label applies to the next consecutive element of the
array or structure.  For example,

      int a[6] = { [1] = v1, v2, [4] = v4 };

is equivalent to

      int a[6] = { 0, v1, v2, 0, v4, 0 };

    Labeling the elements of an array initializer is especially useful
when the indices are characters or belong to an `enum' type.  For
example:

      int whitespace[256]
        = { [' '] = 1, ['\t'] = 1, ['\h'] = 1,
            ['\f'] = 1, ['\n'] = 1, ['\r'] = 1 };



Reply via email to