|
1 | 1 | ---
|
2 | 2 | title: "Summary of Declarations"
|
3 |
| -ms.date: "11/04/2016" |
| 3 | +description: "Learn about the standard C grammar for declarations as implemented by the Microsoft C/C++ compiler." |
| 4 | +ms.date: 10/30/2020 |
4 | 5 | ms.assetid: 53a5e9e5-1a33-40b5-9dea-7f669b479329
|
5 | 6 | ---
|
6 | 7 | # Summary of Declarations
|
7 | 8 |
|
8 |
| -*`declaration`*:<br/> |
9 |
| - *`declaration-specifiers`* *`attribute-seq`*<sub>opt</sub> *`init-declarator-list`*<sub>opt</sub> **`;`** |
10 |
| - |
11 |
| -*`declaration-specifiers`*:<br/> |
12 |
| - *`storage-class-specifier`* *`declaration-specifiers`*<sub>opt</sub><br/> |
13 |
| - *`type-specifier`* *`declaration-specifiers`*<sub>opt</sub><br/> |
14 |
| - *`type-qualifier`* *`declaration-specifiers`*<sub>opt</sub> |
15 |
| - |
16 |
| -*`attribute-seq`* : /\* Microsoft-specific \*/<br/> |
17 |
| - *`attribute`* *`attribute-seq`*<sub>opt</sub> |
18 |
| - |
19 |
| -*`attribute`* : one of /\* Microsoft-specific \*/<br/> |
20 |
| - [`__asm`](../assembler/inline/asm.md) [`__clrcall`](../cpp/clrcall.md) [`__stdcall`](../cpp/stdcall.md) [`__based`](../cpp/based-grammar.md) [`__fastcall`](../cpp/fastcall.md) [`__thiscall`](../cpp/thiscall.md) [`__cdecl`](../cpp/cdecl.md) [`__inline`](../cpp/inline-functions-cpp.md) [`__vectorcall`](../cpp/vectorcall.md) |
21 |
| - |
22 |
| -*`init-declarator-list`*:<br/> |
23 |
| - *`init-declarator`*<br/> |
24 |
| - *`init-declarator-list`* **`,`** *`init-declarator`* |
25 |
| - |
26 |
| -*`init-declarator`*:<br/> |
27 |
| - *`declarator`*<br/> |
28 |
| - *`declarator`* **`=`** *`initializer`* /\* For scalar initialization \*/ |
29 |
| - |
30 |
| -*`storage-class-specifier`*:<br/> |
31 |
| - **`auto`**<br/> |
32 |
| - **`register`**<br/> |
33 |
| - **`static`**<br/> |
34 |
| - **`extern`**<br/> |
35 |
| - **`typedef`**<br/> |
36 |
| - **`__declspec (`** *`extended-decl-modifier-seq`* **`)`** /\* Microsoft-specific \*/ |
37 |
| - |
38 |
| -*`type-specifier`*:<br/> |
39 |
| - **`void`**<br/> |
40 |
| - **`char`**<br/> |
41 |
| - **`short`**<br/> |
42 |
| - **`int`**<br/> |
43 |
| - **`__int8`** /\* Microsoft-specific \*/<br/> |
44 |
| - **`__int16`** /\* Microsoft-specific \*/<br/> |
45 |
| - **`__int32`** /\* Microsoft-specific \*/<br/> |
46 |
| - **`__int64`** /\* Microsoft-specific \*/<br/> |
47 |
| - **`long`**<br/> |
48 |
| - **`float`**<br/> |
49 |
| - **`double`**<br/> |
50 |
| - **`signed`**<br/> |
51 |
| - **`unsigned`**<br/> |
52 |
| - *`struct-or-union-specifier`*<br/> |
53 |
| - *`enum-specifier`*<br/> |
54 |
| - *`typedef-name`* |
55 |
| - |
56 |
| -*`type-qualifier`*:<br/> |
57 |
| - **`const`**<br/> |
58 |
| - **`volatile`** |
59 |
| - |
60 |
| -*`declarator`*:<br/> |
61 |
| - *`pointer`*<sub>opt</sub> *`direct-declarator`* |
62 |
| - |
63 |
| -*`direct-declarator`*:<br/> |
64 |
| - *`identifier`*<br/> |
65 |
| - **`(`** *`declarator`* **`)`**<br/> |
66 |
| - *`direct-declarator`* **`[`** *`constant-expression`*<sub>opt</sub> **`]`**<br/> |
67 |
| - *`direct-declarator`* **`(`** *`parameter-type-list`* **`)`** /\* New-style declarator \*/<br/> |
68 |
| - *`direct-declarator`* **`(`** *`identifier-list`*<sub>opt</sub> **`)`** /\* Obsolete-style declarator \*/ |
69 |
| - |
70 |
| -*`pointer`*:<br/> |
71 |
| - <strong>`*`</strong> *`type-qualifier-list`*<sub>opt</sub><br/> |
72 |
| - <strong>`*`</strong> *`type-qualifier-list`*<sub>opt</sub> *`pointer`* |
73 |
| - |
74 |
| -*`parameter-type-list`*: /\* The parameter list \*/<br/> |
75 |
| - *`parameter-list`*<br/> |
76 |
| - *`parameter-list`* **`, ...`** |
77 |
| - |
78 |
| -*`parameter-list`*:<br/> |
79 |
| - *`parameter-declaration`*<br/> |
80 |
| - *`parameter-list`* **`,`** *`parameter-declaration`* |
81 |
| - |
82 |
| -*`type-qualifier-list`*:<br/> |
83 |
| - *`type-qualifier`*<br/> |
84 |
| - *`type-qualifier-list`* *`type-qualifier`* |
85 |
| - |
86 |
| -*`enum-specifier`*:<br/> |
87 |
| - **`enum`** *`identifier`*<sub>opt</sub> **`{`** *`enumerator-list`* **`}`**<br/> |
88 |
| - **`enum`** *`identifier`* |
89 |
| - |
90 |
| -*`enumerator-list`*:<br/> |
91 |
| - *`enumerator`*<br/> |
92 |
| - *`enumerator-list`* **`,`** *`enumerator`* |
93 |
| - |
94 |
| -*`enumerator`*:<br/> |
95 |
| - *`enumeration-constant`*<br/> |
96 |
| - *`enumeration-constant`* **`=`** *`constant-expression`* |
97 |
| - |
98 |
| -*`enumeration-constant`*:<br/> |
99 |
| - *`identifier`* |
100 |
| - |
101 |
| -*`struct-or-union-specifier`*:<br/> |
102 |
| - *`struct-or-union`* *`identifier`*<sub>opt</sub> **`{`** *`struct-declaration-list`* **`}`**<br/> |
103 |
| - *`struct-or-union`* *`identifier`* |
104 |
| - |
105 |
| -*`struct-or-union`*:<br/> |
106 |
| - **`struct`**<br/> |
107 |
| - **`union`** |
108 |
| - |
109 |
| -*`struct-declaration-list`*:<br/> |
110 |
| - *`struct-declaration`*<br/> |
111 |
| - *`struct-declaration-list`* *`struct-declaration`* |
112 |
| - |
113 |
| -*`struct-declaration`*:<br/> |
114 |
| - *`specifier-qualifier-list`* *`struct-declarator-list`* **`;`** |
115 |
| - |
116 |
| -*`specifier-qualifier-list`*:<br/> |
117 |
| - *`type-specifier`* *`specifier-qualifier-list`*<sub>opt</sub><br/> |
118 |
| - *`type-qualifier`* *`specifier-qualifier-list`*<sub>opt</sub> |
119 |
| - |
120 |
| -*`struct-declarator-list`*:<br/> |
121 |
| - *`struct-declarator`* *`struct-declarator-list`* **`,`** *`struct-declarator`* |
122 |
| - |
123 |
| -*`struct-declarator`*:<br/> |
124 |
| - *`declarator`*<br/> |
125 |
| - *`type-specifier`* *`declarator`*<sub>opt</sub> **`:`** *`constant-expression`* |
126 |
| - |
127 |
| -*`parameter-declaration`*:<br/> |
128 |
| - *`declaration-specifiers`* *`declarator`* /\* Named declarator \*/<br/> |
129 |
| - *`declaration-specifiers`* *`abstract-declarator`*<sub>opt</sub> /\* Anonymous declarator \*/ |
130 |
| - |
131 |
| -*`identifier-list`*: /\* For old-style declarator \*/<br/> |
132 |
| - *`identifier`*<br/> |
133 |
| - *`identifier-list`* **`,`** *`identifier`* |
134 |
| - |
135 |
| -*`abstract-declarator`*: /\* Used with anonymous declarators \*/<br/> |
136 |
| - *`pointer`*<br/> |
137 |
| - *`pointer`*<sub>opt</sub> *`direct-abstract-declarator`* |
138 |
| - |
139 |
| -*`direct-abstract-declarator`*:<br/> |
140 |
| - **`(`** *`abstract-declarator`* **`)`**<br/> |
141 |
| - *`direct-abstract-declarator`*<sub>opt</sub> **`[`** *`constant-expression`*<sub>opt</sub> **`]`**<br/> |
142 |
| - *`direct-abstract-declarator`*<sub>opt</sub> **`(`** *`parameter-type-list`*<sub>opt</sub> **`)`** |
143 |
| - |
144 |
| -*`initializer`*:<br/> |
145 |
| - *`assignment-expression`*<br/> |
146 |
| - **`{`** *`initializer-list`* **`}`** /\* For aggregate initialization \*/<br/> |
147 |
| - **`{`** *`initializer-list`* **`, }`** |
148 |
| - |
149 |
| -*`initializer-list`*:<br/> |
150 |
| - *`initializer`*<br/> |
151 |
| - *`initializer-list`* **`,`** *`initializer`* |
152 |
| - |
153 |
| -*`type-name`*:<br/> |
154 |
| - *`specifier-qualifier-list`* *`abstract-declarator`*<sub>opt</sub> |
155 |
| - |
156 |
| -*`typedef-name`*:<br/> |
157 |
| - *`identifier`* |
158 |
| - |
159 |
| -*`extended-decl-modifier-seq`*: /\* Microsoft-specific \*/<br/> |
160 |
| - *`extended-decl-modifier`*<sub>opt</sub><br/> |
161 |
| - *`extended-decl-modifier-seq`* *`extended-decl-modifier`* |
162 |
| - |
163 |
| -*`extended-decl-modifier`*: /\* Microsoft-specific \*/<br/> |
164 |
| - **`thread`**<br/> |
165 |
| - **`naked`**<br/> |
166 |
| - **`dllimport`**<br/> |
167 |
| - **`dllexport`** |
| 9 | +*`declaration`*:\ |
| 10 | + *`declaration-specifiers`* *`attribute-seq`*<sub>opt</sub><sup>1</sup> *`init-declarator-list`*<sub>opt</sub> **`;`**\ |
| 11 | + *`static_assert-declaration`* |
| 12 | + |
| 13 | +*`declaration-specifiers`*:\ |
| 14 | + *`storage-class-specifier`* *`declaration-specifiers`*<sub>opt</sub>\ |
| 15 | + *`type-specifier`* *`declaration-specifiers`*<sub>opt</sub>\ |
| 16 | + *`type-qualifier`* *`declaration-specifiers`*<sub>opt</sub>\ |
| 17 | + *`function-specifier`* *`declaration-specifiers`*<sub>opt</sub>\ |
| 18 | + *`alignment-specifier`* *`declaration-specifiers`*<sub>opt</sub> |
| 19 | + |
| 20 | +*`attribute-seq`*<sup>1</sup>:\ |
| 21 | + *`attribute`*<sup>1</sup> *`attribute-seq`*<sub>opt</sub><sup>1</sup> |
| 22 | + |
| 23 | +*`attribute`*<sup>1, 2</sup>: one of\ |
| 24 | + **`__asm`** **`__based`** **`__cdecl`** **`__clrcall`** **`__fastcall`** **`__inline`** **`__stdcall`** **`__thiscall`** **`__vectorcall`** |
| 25 | + |
| 26 | +*`init-declarator-list`*:\ |
| 27 | + *`init-declarator`*\ |
| 28 | + *`init-declarator-list`* **`,`** *`init-declarator`* |
| 29 | + |
| 30 | +*`init-declarator`*:\ |
| 31 | + *`declarator`*\ |
| 32 | + *`declarator`* **`=`** *`initializer`* |
| 33 | + |
| 34 | +*`storage-class-specifier`*:\ |
| 35 | + **`auto`**\ |
| 36 | + **`extern`**\ |
| 37 | + **`register`**\ |
| 38 | + **`static`**\ |
| 39 | + **`_Thread_local`**\ |
| 40 | + **`typedef`**\ |
| 41 | + **`__declspec`** **`(`** *`extended-decl-modifier-seq`* **`)`**<sup>1</sup> |
| 42 | + |
| 43 | +*`extended-decl-modifier-seq`*<sup>1</sup>:\ |
| 44 | + *`extended-decl-modifier`*<sub>opt</sub>\ |
| 45 | + *`extended-decl-modifier-seq`* *`extended-decl-modifier`* |
| 46 | + |
| 47 | +*`extended-decl-modifier`*<sup>1</sup>:\ |
| 48 | + **`thread`**\ |
| 49 | + **`naked`**\ |
| 50 | + **`dllimport`**\ |
| 51 | + **`dllexport`** |
| 52 | + |
| 53 | +*`type-specifier`*:\ |
| 54 | + **`void`**\ |
| 55 | + **`char`**\ |
| 56 | + **`short`**\ |
| 57 | + **`int`**\ |
| 58 | + **`__int8`**<sup>1</sup>\ |
| 59 | + **`__int16`**<sup>1</sup>\ |
| 60 | + **`__int32`**<sup>1</sup>\ |
| 61 | + **`__int64`**<sup>1</sup>\ |
| 62 | + **`long`**\ |
| 63 | + **`float`**\ |
| 64 | + **`double`**\ |
| 65 | + **`signed`**\ |
| 66 | + **`unsigned`**\ |
| 67 | + **`_Bool`**\ |
| 68 | + **`_Complex`**\ |
| 69 | + *`atomic-type-specifier`*\ |
| 70 | + *`struct-or-union-specifier`*\ |
| 71 | + *`enum-specifier`*\ |
| 72 | + *`typedef-name`* |
| 73 | + |
| 74 | +*`struct-or-union-specifier`*:\ |
| 75 | + *`struct-or-union`* *`identifier`*<sub>opt</sub> **`{`** *`struct-declaration-list`* **`}`**\ |
| 76 | + *`struct-or-union`* *`identifier`* |
| 77 | + |
| 78 | +*`struct-or-union`*:\ |
| 79 | + **`struct`**\ |
| 80 | + **`union`** |
| 81 | + |
| 82 | +*`struct-declaration-list`*:\ |
| 83 | + *`struct-declaration`*\ |
| 84 | + *`struct-declaration-list`* *`struct-declaration`* |
| 85 | + |
| 86 | +*`struct-declaration`*:\ |
| 87 | + *`specifier-qualifier-list`* *`struct-declarator-list`*<sub>opt</sub> **`;`**\ |
| 88 | + *`static_assert-declaration`* |
| 89 | + |
| 90 | +*`specifier-qualifier-list`*:\ |
| 91 | + *`type-specifier`* *`specifier-qualifier-list`*<sub>opt</sub>\ |
| 92 | + *`type-qualifier`* *`specifier-qualifier-list`*<sub>opt</sub>\ |
| 93 | + *`alignment-specifier`* *`specifier-qualifier-list`*<sub>opt</sub> |
| 94 | + |
| 95 | +*`struct-declarator-list`*:\ |
| 96 | + *`struct-declarator`*\ |
| 97 | + *`struct-declarator-list`* **`,`** *`struct-declarator`* |
| 98 | + |
| 99 | +*`struct-declarator`*:\ |
| 100 | + *`declarator`*\ |
| 101 | + *`declarator`*<sub>opt</sub> **`:`** *`constant-expression`* |
| 102 | + |
| 103 | +*`enum-specifier`*:\ |
| 104 | + **`enum`** *`identifier`*<sub>opt</sub> **`{`** *`enumerator-list`* **`}`**\ |
| 105 | + **`enum`** *`identifier`*<sub>opt</sub> **`{`** *`enumerator-list`* **`,`** **`}`**\ |
| 106 | + **`enum`** *`identifier`* |
| 107 | + |
| 108 | +*`enumerator-list`*:\ |
| 109 | + *`enumerator`*\ |
| 110 | + *`enumerator-list`* **`,`** *`enumerator`* |
| 111 | + |
| 112 | +*`enumerator`*:\ |
| 113 | + *`enumeration-constant`*\ |
| 114 | + *`enumeration-constant`* **`=`** *`constant-expression`* |
| 115 | + |
| 116 | +*`atomic-type-specifier`*:\ |
| 117 | + **`_Atomic`** **`(`** *`type-name`* **`)`** |
| 118 | + |
| 119 | +*`type-qualifier`*:\ |
| 120 | + **`const`**\ |
| 121 | + **`restrict`**\ |
| 122 | + **`volatile`**\ |
| 123 | + **`_Atomic`** |
| 124 | + |
| 125 | +*`function-specifier`*:\ |
| 126 | + **`inline`**\ |
| 127 | + **`_Noreturn`** |
| 128 | + |
| 129 | +*`alignment-specifier`*:\ |
| 130 | + **`_Alignas`** **`(`** *`type-name`* **`)`**\ |
| 131 | + **`_Alignas`** **`(`** *`constant-expression`* **`)`** |
| 132 | + |
| 133 | +*`declarator`*:\ |
| 134 | + *`pointer`*<sub>opt</sub> *`direct-declarator`* |
| 135 | + |
| 136 | +*`direct-declarator`*:\ |
| 137 | + *`identifier`*\ |
| 138 | + **`(`** *`declarator`* **`)`**\ |
| 139 | + *`direct-declarator`* **`[`** *`type-qualifier-list`*<sub>opt</sub> *`assignment-expression`*<sub>opt</sub> **`]`**\ |
| 140 | + *`direct-declarator`* **`[`** **`static`** *`type-qualifier-list`*<sub>opt</sub> *`assignment-expression`* **`]`**\ |
| 141 | + *`direct-declarator`* **`[`** *`type-qualifier-list`* **`static`** *`assignment-expression`* **`]`**\ |
| 142 | + *`direct-declarator`* **`[`** *`type-qualifier-list`*<sub>opt</sub> **`*`** **`]`**\ |
| 143 | + *`direct-declarator`* **`(`** *`parameter-type-list`* **`)`**\ |
| 144 | + *`direct-declarator`* **`(`** *`identifier-list`*<sub>opt</sub> **`)`**<sup>3</sup> |
| 145 | + |
| 146 | +*`pointer`*:\ |
| 147 | + **`*`** *`type-qualifier-list`*<sub>opt</sub>\ |
| 148 | + **`*`** *`type-qualifier-list`*<sub>opt</sub> *`pointer`* |
| 149 | + |
| 150 | +*`type-qualifier-list`*:\ |
| 151 | + *`type-qualifier`*\ |
| 152 | + *`type-qualifier-list`* *`type-qualifier`* |
| 153 | + |
| 154 | +*`parameter-type-list`*:\ |
| 155 | + *`parameter-list`*\ |
| 156 | + *`parameter-list`* **`,`** **`...`** |
| 157 | + |
| 158 | +*`parameter-list`*:\ |
| 159 | + *`parameter-declaration`*\ |
| 160 | + *`parameter-list`* **`,`** *`parameter-declaration`* |
| 161 | + |
| 162 | +*`parameter-declaration`*:\ |
| 163 | + *`declaration-specifiers`* *`declarator`*\ |
| 164 | + *`declaration-specifiers`* *`abstract-declarator`*<sub>opt</sub> |
| 165 | + |
| 166 | +*`identifier-list`*: /\* For old-style declarator \*/\ |
| 167 | + *`identifier`*\ |
| 168 | + *`identifier-list`* **`,`** *`identifier`* |
| 169 | + |
| 170 | +*`type-name`*:\ |
| 171 | + *`specifier-qualifier-list`* *`abstract-declarator`*<sub>opt</sub> |
| 172 | + |
| 173 | +*`abstract-declarator`*:\ |
| 174 | + *`pointer`*\ |
| 175 | + *`pointer`*<sub>opt</sub> *`direct-abstract-declarator`* |
| 176 | + |
| 177 | +*`direct-abstract-declarator`*:\ |
| 178 | + **`(`** *`abstract-declarator`* **`)`**\ |
| 179 | + *`direct-abstract-declarator`* **`[`** *`type-qualifier-list`*<sub>opt</sub> *`assignment-expression`*<sub>opt</sub> **`]`**\ |
| 180 | + *`direct-abstract-declarator`* **`[`** **`static`** *`type-qualifier-list`*<sub>opt</sub> *`assignment-expression`* **`]`**\ |
| 181 | + *`direct-abstract-declarator`* **`[`** *`type-qualifier-list`* **`static`** *`assignment-expression`* **`]`**\ |
| 182 | + *`direct-abstract-declarator`* **`[`** *`type-qualifier-list`*<sub>opt</sub> **`*`** **`]`**\ |
| 183 | + *`direct-abstract-declarator`*<sub>opt</sub> **`(`** *`parameter-type-list`*<sub>opt</sub> **`)`** |
| 184 | + |
| 185 | +*`typedef-name`*:\ |
| 186 | + *`identifier`* |
| 187 | + |
| 188 | +*`initializer`*:\ |
| 189 | + *`assignment-expression`*\ |
| 190 | + **`{`** *`initializer-list`* **`}`**\ |
| 191 | + **`{`** *`initializer-list`* **`, }`** |
| 192 | + |
| 193 | +*`initializer-list`*:\ |
| 194 | + *`designation`*<sub>opt</sub> *`initializer`*\ |
| 195 | + *`initializer-list`* **`,`** *`designation`*<sub>opt</sub> *`initializer`* |
| 196 | + |
| 197 | +*`designation`*:\ |
| 198 | + *`designator-list`* **`=`** |
| 199 | + |
| 200 | +*`designator-list`*:\ |
| 201 | + *`designator`*\ |
| 202 | + *`designator-list`* *`designator`* |
| 203 | + |
| 204 | +*`designator`*:\ |
| 205 | + **`[`** *`constant-expression`* **`]`**\ |
| 206 | + **`.`** *`identifier`* |
| 207 | + |
| 208 | +*`static_assert-declaration`*:\ |
| 209 | + **`_Static_assert`** **`(`** *`constant-expression`* **`,`** *`string-literal`* **`)`** **`;`** |
| 210 | + |
| 211 | +<sup>1</sup> This grammar element is Microsoft-specific.\ |
| 212 | +<sup>2</sup> For more information about these elements, see [`__asm`](../assembler/inline/asm.md), [`__clrcall`](../cpp/clrcall.md), [`__stdcall`](../cpp/stdcall.md), [`__based`](../cpp/based-grammar.md), [`__fastcall`](../cpp/fastcall.md), [`__thiscall`](../cpp/thiscall.md), [`__cdecl`](../cpp/cdecl.md), [`__inline`](../cpp/inline-functions-cpp.md), and [`__vectorcall`](../cpp/vectorcall.md). |
| 213 | +<sup>3</sup> This style is obsolete. |
168 | 214 |
|
169 | 215 | ## See also
|
170 | 216 |
|
171 |
| -[Calling Conventions](../cpp/calling-conventions.md)<br/> |
172 |
| -[Phrase Structure Grammar](../c-language/phrase-structure-grammar.md)<br/> |
173 |
| -[Obsolete Calling Conventions](../cpp/obsolete-calling-conventions.md) |
| 217 | +[Calling conventions](../cpp/calling-conventions.md)\ |
| 218 | +[Phrase structure grammar](./phrase-structure-grammar.md)\ |
| 219 | +[Obsolete calling conventions](../cpp/obsolete-calling-conventions.md) |
0 commit comments