6.7.5 Declarators

Syntax

1

declarator:

pointeropt direct-declarator

direct-declarator:

identifier

( declarator )

direct-declarator [ type-qualifier-listopt assignment-expressionopt ]

direct-declarator [ static type-qualifier-listopt assignment-expression ]

direct-declarator [ type-qualifier-list static assignment-expression ]

direct-declarator [ type-qualifier-listopt * ]

direct-declarator ( parameter-type-list )

direct-declarator ( identifier-listopt )

pointer:

* type-qualifier-listopt

* type-qualifier-listopt pointer

type-qualifier-list:

type-qualifier

type-qualifier-list type-qualifier

parameter-type-list:

parameter-list

parameter-list , ...

parameter-list:

parameter-declaration

parameter-list , parameter-declaration

parameter-declaration:

declaration-specifiers declarator

declaration-specifiers abstract-declaratoropt

identifier-list:

identifier

identifier-list , identifier

Semantics

2

Each declarator declares one identifier, and asserts that when an operand of the same form as the declarator appears in an expression, it designates a function or object with the scope, storage duration, and type indicated by the declaration specifiers.

3

A full declarator is a declarator that is not part of another declarator. The end of a full declarator is a sequence point. If, in the nested sequence of declarators in a full declarator, there is a declarator specifying a variable length array type, the type specified by the full declarator is said to be variably modified. Furthermore, any type derived by declarator type derivation from a variably modified type is itself variably modified.

4

In the following subclauses, consider a declaration

T D1

where T contains the declaration specifiers that specify a type T (such as int) and D1 is a declarator that contains an identifier ident. The type specified for the identifier ident in the various forms of declarator is described inductively using this notation.

5

If, in the declaration “T D1”, D1 has the form

identifier

then the type specified for ident is T .

6

If, in the declaration “T D1”, D1 has the form

( D )

then ident has the type specified by the declaration “T D”. Thus, a declarator in parentheses is identical to the unparenthesized declarator, but the binding of complicated declarators may be altered by parentheses.

Implementation limits

7

As discussed in 5.2.4.1, an implementation may limit the number of pointer, array, and function declarators that modify an arithmetic, structure, union, or incomplete type, either directly or via one or more typedefs.

Forward References