.B code
.I identifier
.B
-.I identifier
+.I item-name
.RI [ constraints ]
.B {
.I c-fragment
.br
.I constraint
::=
+.IR item-name \*+
+.br
+.I item-name
+::=
+.I identifier
+|
+.B (
.IR identifier \*+
+.B )
.
.SS Class definitions
.I
.|
.I initializer-item
.|
+.I initarg-item
+.|
+.I fragment-item
+.|
.I message-item
.|
.I method-item
.I slot-initializer
::=
.I dotted-name
-.B =
-.I initializer
+.RB [ =
+.IR initializer ]
.br
.I initializer
::=
+.I c-fragment
+.br
+.I initarg-item
+::=
+.<
+.B initarg
+.IR declaration-specifier \*+
+.IR list [ init-declarator ]
+.B ;
+.br
+.I fragment-item
+::=
+.I fragment-kind
.B {
.I c-fragment
.B }
+.br
+.I fragment-kind
+::=
+.B init
|
-.I c-fragment
+.B teardown
.br
.I message-item
::=
.<
.IR declaration-specifier \*+
-.I simple-declarator
+.IR keyword-declarator [ identifier ]
+.<
.RI [ method-body ]
.br
.I method-item
::=
.<
.IR declaration-specifier \*+
-.IR declarator [ dotted-name ]
+.IR keyword-declarator [ dotted-name ]
+.<
.I method-body
.br
.I method-body
|
.I identifier
.|
+.B <
+.I plain-type
+.B >
+.|
.B ?
.I s-expression
.|
.B _Complex
.|
.I qualifier
+.|
+.I storage-specifier
+.|
+.I atomic-type
.br
.I qualifier
::=
+.I atomic
+|
.B const
|
.B volatile
|
.B restrict
.br
+.I plain-type
+::=
+.IR declaration-specifier \*+
+.I abstract-declarator
+.br
+.I atomic-type
+::=
+.I
+atomic
+.B (
+.I plain-type
+.B )
+.br
+.I atomic
+::=
+.B atomic
+|
+.B _Atomic
+.br
+.I storage-specifier
+::=
+.I alignas
+.B (
+.I c-fragment
+.B )
+.br
+.I alignas
+::=
+.B alignas
+|
+.B _Alignas
+.br
.I type-name
::=
.I identifier
Declaration specifiers may appear in any order.
However, not all combinations are permitted.
A declaration specifier must consist of
-zero or more qualifiers,
+zero or more
+.IR qualifier s,
+zero or more
+.IR storage-specifier s,
and one of the following, up to reordering.
.hP \*o
.I type-name
.BR "double complex" ,
.B "long double complex"
.PP
-.IR declarator [ k ]
+.IR declarator [ k ", " a ]
::=
.IR pointer \**
-.IR primary-declarator [ k ]
+.IR primary-declarator [ k ", " a ]
.br
-.IR primary-declarator [ k ]
+.IR primary-declarator [ k ", " a ]
::=
.I k
.|
.B (
-.IR primary-declarator [ k ]
+.IR primary-declarator [ k ", " a ]
.B )
.|
-.IR primary-declarator [ k ]
-.IR declarator-suffix
+.IR primary-declarator [ k ", " a ]
+.IR declarator-suffix [ a ]
.br
.I pointer
::=
.B *
.IR qualifier \**
.br
-.I declarator-suffix
+.IR declarator-suffix [ a ]
::=
.B [
.I c-fragment
.B ]
.|
.B (
-.I argument-list
+.I a
.B )
.br
.I argument-list
.IR declaration-specifier \*+
.I argument-declarator
.br
+.I abstract-declarator
+::=
+.IR declarator "[\*e, " argument-list ]
+.br
.I argument-declarator
::=
-.IR declarator [ identifier " | \*e]"
+.IR declarator [ identifier " | \*e, " argument-list ]
.br
.I simple-declarator
::=
-.IR declarator [ identifier ]
+.IR declarator [ identifier ", " argument-list ]
+.br
+.I keyword-argument
+::=
+.I argument
+.RB [ =
+.IR c-fragment ]
+.br
+.I keyword-argument-list
+::=
+.I argument-list
+.B ?\&
+.I keyword-argument-list
+.br
+.I method-argument-list
+::=
+.I argument-list
+|
+.I keyword-argument-list
.br
.I dotted-name
::=
.I identifier
.B .\&
.I identifier
+.br
+.IR keyword-declarator [ k ]
+::=
+.IR declarator [ k ", " method-argument-list ]
.
.\"--------------------------------------------------------------------------
.SH SEE ALSO