extend.texi (Zero-length arrays): Update and clarify.

gcc/ChangeLog:

	* doc/extend.texi (Zero-length arrays): Update and clarify.

From-SVN: r262109
This commit is contained in:
Martin Sebor 2018-06-25 19:46:14 +00:00 committed by Martin Sebor
parent 214486ebe2
commit 2bcd87a7b5
2 changed files with 30 additions and 7 deletions

View File

@ -1,3 +1,7 @@
2018-06-25 Martin Sebor <msebor@redhat.com>
* doc/extend.texi (Zero-length arrays): Update and clarify.
2018-06-25 Michael Meissner <meissner@linux.ibm.com>
* config.gcc (powerpc64le*): Revert January 16th, 2018 patch that

View File

@ -1537,9 +1537,9 @@ defined when these address spaces are supported.
@cindex length-zero arrays
@cindex flexible array members
Zero-length arrays are allowed in GNU C@. They are very useful as the
last element of a structure that is really a header for a variable-length
object:
Declaring zero-length arrays is allowed in GNU C as an extension.
A zero-length array can be useful as the last element of a structure
that is really a header for a variable-length object:
@smallexample
struct line @{
@ -1552,11 +1552,30 @@ struct line *thisline = (struct line *)
thisline->length = this_length;
@end smallexample
In ISO C90, you would have to give @code{contents} a length of 1, which
means either you waste space or complicate the argument to @code{malloc}.
Although the size of a zero-length array is zero, an array member of
this kind may increase the size of the enclosing type as a result of tail
padding. The offset of a zero-length array member from the beginning
of the enclosing structure is the same as the offset of an array with
one or more elements of the same type. The alignment of a zero-length
array is the same as the alignment of its elements.
In ISO C99, you would use a @dfn{flexible array member}, which is
slightly different in syntax and semantics:
Declaring zero-length arrays in other contexts, including as interior
members of structure objects or as non-member objects, is discouraged.
Accessing elements of zero-length arrays declared in such contexts is
undefined and may be diagnosed.
In the absence of the zero-length array extension, in ISO C90
the @code{contents} array in the example above would typically be declared
to have a single element. Unlike a zero-length array which only contributes
to the size of the enclosing structure for the purposes of alignment,
a one-element array always occupies at least as much space as a single
object of the type. Although using one-element arrays this way is
discouraged, GCC handles accesses to trailing one-element array members
analogously to zero-length arrays.
The preferred mechanism to declare variable-length types like
@code{struct line} above is the ISO C99 @dfn{flexible array member},
with slightly different syntax and semantics:
@itemize @bullet
@item