hc
2023-05-26 a23f51ed7a39e452c1037343a84d7db1ca2c5bd7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- Copyright (C) 1988-2016 Free Software Foundation, Inc.
 
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being "Funding Free Software", the Front-Cover
Texts being (a) (see below), and with the Back-Cover Texts being (b)
(see below).  A copy of the license is included in the section entitled
"GNU Free Documentation License".
 
(a) The FSF's Front-Cover Text is:
 
A GNU Manual
 
(b) The FSF's Back-Cover Text is:
 
You have freedom to copy and modify this GNU Manual, like GNU
     software.  Copies published by the Free Software Foundation raise
     funds for GNU development. -->
<!-- Created by GNU Texinfo 5.2, http://www.gnu.org/software/texinfo/ -->
<head>
<title>Using the GNU Compiler Collection (GCC): Designated Inits</title>
 
<meta name="description" content="Using the GNU Compiler Collection (GCC): Designated Inits">
<meta name="keywords" content="Using the GNU Compiler Collection (GCC): Designated Inits">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="index.html#Top" rel="start" title="Top">
<link href="Option-Index.html#Option-Index" rel="index" title="Option Index">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="C-Extensions.html#C-Extensions" rel="up" title="C Extensions">
<link href="Case-Ranges.html#Case-Ranges" rel="next" title="Case Ranges">
<link href="Compound-Literals.html#Compound-Literals" rel="prev" title="Compound Literals">
<style type="text/css">
<!--
a.summary-letter {text-decoration: none}
blockquote.smallquotation {font-size: smaller}
div.display {margin-left: 3.2em}
div.example {margin-left: 3.2em}
div.indentedblock {margin-left: 3.2em}
div.lisp {margin-left: 3.2em}
div.smalldisplay {margin-left: 3.2em}
div.smallexample {margin-left: 3.2em}
div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
div.smalllisp {margin-left: 3.2em}
kbd {font-style:oblique}
pre.display {font-family: inherit}
pre.format {font-family: inherit}
pre.menu-comment {font-family: serif}
pre.menu-preformatted {font-family: serif}
pre.smalldisplay {font-family: inherit; font-size: smaller}
pre.smallexample {font-size: smaller}
pre.smallformat {font-family: inherit; font-size: smaller}
pre.smalllisp {font-size: smaller}
span.nocodebreak {white-space:nowrap}
span.nolinebreak {white-space:nowrap}
span.roman {font-family:serif; font-weight:normal}
span.sansserif {font-family:sans-serif; font-weight:normal}
ul.no-bullet {list-style: none}
-->
</style>
 
 
</head>
 
<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
<a name="Designated-Inits"></a>
<div class="header">
<p>
Next: <a href="Case-Ranges.html#Case-Ranges" accesskey="n" rel="next">Case Ranges</a>, Previous: <a href="Compound-Literals.html#Compound-Literals" accesskey="p" rel="prev">Compound Literals</a>, Up: <a href="C-Extensions.html#C-Extensions" accesskey="u" rel="up">C Extensions</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html#Option-Index" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<a name="Designated-Initializers"></a>
<h3 class="section">6.27 Designated Initializers</h3>
<a name="index-initializers-with-labeled-elements"></a>
<a name="index-labeled-elements-in-initializers"></a>
<a name="index-case-labels-in-initializers"></a>
<a name="index-designated-initializers"></a>
 
<p>Standard C90 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.
</p>
<p>In ISO C99 you can give the elements in any order, specifying the array
indices or structure field names they apply to, and GNU C allows this as
an extension in C90 mode as well.  This extension is not
implemented in GNU C++.
</p>
<p>To specify an array index, write
&lsquo;<samp>[<var>index</var>] =</samp>&rsquo; before the element value.  For example,
</p>
<div class="smallexample">
<pre class="smallexample">int a[6] = { [4] = 29, [2] = 15 };
</pre></div>
 
<p>is equivalent to
</p>
<div class="smallexample">
<pre class="smallexample">int a[6] = { 0, 0, 15, 0, 29, 0 };
</pre></div>
 
<p>The index values must be constant expressions, even if the array being
initialized is automatic.
</p>
<p>An alternative syntax for this that has been obsolete since GCC 2.5 but
GCC still accepts is to write &lsquo;<samp>[<var>index</var>]</samp>&rsquo; before the element
value, with no &lsquo;<samp>=</samp>&rsquo;.
</p>
<p>To initialize a range of elements to the same value, write
&lsquo;<samp>[<var>first</var> ... <var>last</var>] = <var>value</var></samp>&rsquo;.  This is a GNU
extension.  For example,
</p>
<div class="smallexample">
<pre class="smallexample">int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };
</pre></div>
 
<p>If the value in it has side-effects, the side-effects happen only once,
not for each initialized field by the range initializer.
</p>
<p>Note that the length of the array is the highest value specified
plus one.
</p>
<p>In a structure initializer, specify the name of a field to initialize
with &lsquo;<samp>.<var>fieldname</var> =</samp>&rsquo; before the element value.  For example,
given the following structure,
</p>
<div class="smallexample">
<pre class="smallexample">struct point { int x, y; };
</pre></div>
 
<p>the following initialization
</p>
<div class="smallexample">
<pre class="smallexample">struct point p = { .y = yvalue, .x = xvalue };
</pre></div>
 
<p>is equivalent to
</p>
<div class="smallexample">
<pre class="smallexample">struct point p = { xvalue, yvalue };
</pre></div>
 
<p>Another syntax that has the same meaning, obsolete since GCC 2.5, is
&lsquo;<samp><var>fieldname</var>:</samp>&rsquo;, as shown here:
</p>
<div class="smallexample">
<pre class="smallexample">struct point p = { y: yvalue, x: xvalue };
</pre></div>
 
<p>Omitted field members are implicitly initialized the same as objects
that have static storage duration.
</p>
<a name="index-designators"></a>
<p>The &lsquo;<samp>[<var>index</var>]</samp>&rsquo; or &lsquo;<samp>.<var>fieldname</var></samp>&rsquo; is known as a
<em>designator</em>.  You can also use a designator (or the obsolete colon
syntax) when initializing a union, to specify which element of the union
should be used.  For example,
</p>
<div class="smallexample">
<pre class="smallexample">union foo { int i; double d; };
 
union foo f = { .d = 4 };
</pre></div>
 
<p>converts 4 to a <code>double</code> to store it in the union using
the second element.  By contrast, casting 4 to type <code>union foo</code>
stores it into the union as the integer <code>i</code>, since it is
an integer.  (See <a href="Cast-to-Union.html#Cast-to-Union">Cast to Union</a>.)
</p>
<p>You can combine this technique of naming elements with ordinary C
initialization of successive elements.  Each initializer element that
does not have a designator applies to the next consecutive element of the
array or structure.  For example,
</p>
<div class="smallexample">
<pre class="smallexample">int a[6] = { [1] = v1, v2, [4] = v4 };
</pre></div>
 
<p>is equivalent to
</p>
<div class="smallexample">
<pre class="smallexample">int a[6] = { 0, v1, v2, 0, v4, 0 };
</pre></div>
 
<p>Labeling the elements of an array initializer is especially useful
when the indices are characters or belong to an <code>enum</code> type.
For example:
</p>
<div class="smallexample">
<pre class="smallexample">int whitespace[256]
  = { [' '] = 1, ['\t'] = 1, ['\h'] = 1,
      ['\f'] = 1, ['\n'] = 1, ['\r'] = 1 };
</pre></div>
 
<a name="index-designator-lists"></a>
<p>You can also write a series of &lsquo;<samp>.<var>fieldname</var></samp>&rsquo; and
&lsquo;<samp>[<var>index</var>]</samp>&rsquo; designators before an &lsquo;<samp>=</samp>&rsquo; to specify a
nested subobject to initialize; the list is taken relative to the
subobject corresponding to the closest surrounding brace pair.  For
example, with the &lsquo;<samp>struct point</samp>&rsquo; declaration above:
</p>
<div class="smallexample">
<pre class="smallexample">struct point ptarray[10] = { [2].y = yv2, [2].x = xv2, [0].x = xv0 };
</pre></div>
 
<p>If the same field is initialized multiple times, it has the value from
the last initialization.  If any such overridden initialization has
side-effect, it is unspecified whether the side-effect happens or not.
Currently, GCC discards them and issues a warning.
</p>
<hr>
<div class="header">
<p>
Next: <a href="Case-Ranges.html#Case-Ranges" accesskey="n" rel="next">Case Ranges</a>, Previous: <a href="Compound-Literals.html#Compound-Literals" accesskey="p" rel="prev">Compound Literals</a>, Up: <a href="C-Extensions.html#C-Extensions" accesskey="u" rel="up">C Extensions</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html#Option-Index" title="Index" rel="index">Index</a>]</p>
</div>
 
 
 
</body>
</html>