Identifier
An identifier is an arbitrarily long sequence of digits, underscores, lowercase and uppercase Latin letters, and Unicode characters specified using \u
and \U
escape notation (since C99). A valid identifier must begin with a non-digit character (Latin letter, underscore, or Unicode non-digit character (since C99)). Identifiers are case-sensitive (lowercase and uppercase letters are distinct).
It is implementation-defined if raw (not escaped) Unicode characters are allowed in identifiers:
char *\U0001f431 = "cat"; // supported char *🐱 = "cat"; // implementation-defined (e.g. works with Clang, but not GCC) |
(since C99) |
Identifiers can denote the following types of entities:
- objects
- functions
- tags (struct, union, or enumerations)
- structure or union members
- enumeration constants
- typedef names
- label names
- macro names
- macro parameter names
Every identifier other than macro name or macro parameter name has scope, belongs to a name space, and may have linkage. The same identifier can denote different entities at different points in the program, or may denote different entities at the same point if the entities are in different name spaces.
Reserved identifiers
The following identifiers are reserved and may not be declared in a program (doing so invokes undefined behavior):
- function names
-
cerf
,cerfc
,cexp2
,cexpm1
,clog10
,clog1p
,clog2
,clgamma
,ctgamma
and their -f and -l suffixed variants, in <complex.h> - beginning with
is
orto
followed by a lowercase letter, in <ctype.h> and wctype.h - beginning with
str
followed by a lowercase letter, in <stdlib.h> - beginning with
str
,mem
orwcs
followed by a lowercase letter, in <string.h> - beginning with
wcs
followed by a lowercase letter, in <wchar.h> - beginning with
atomic_
followed by a lowercase letter, in <stdatomic.h> - beginning with
cnd_
,mtx_
,thrd_
ortss_
followed by a lowercase letter, in <threads.h>
-
- typedef names
- beginning with
int
oruint
and ending with_t
, in <stdint.h> - beginning with
atomic_
ormemory_
followed by a lowercase letter, in <stdatomic.h> - beginning with
cnd_
,mtx_
,thrd_
ortss_
followed by a lowercase letter, in <threads.h>
- beginning with
- macro names
- beginning with
E
followed by a digit or an uppercase letter, in <errno.h> - beginning with
FE_
followed by an uppercase letter, in <fenv.h> - beginning with
INT
orUINT
and ending with_MAX
,_MIN
, or_C
, in <stdint.h> - beginning with
PRI
orSCN
followed by lowercase letter or the letterX
, in <stdint.h> - beginning with
LC_
followed by an uppercase letter, in <locale.h> - beginning with
SIG
orSIG_
followed by an uppercase letter, in <signal.h> - beginning with
TIME_
followed by an uppercase letter, in <time.h> - beginning with
ATOMIC_
followed by an uppercase letter, in <stdatomic.h>
- beginning with
- enumeration constants
- beginning with
memory_order_
followed by a lowercase letter, in <stdatomic.h> - beginning with
cnd_
,mtx_
,thrd_
ortss_
followed by a lowercase letter, in <threads.h>
- beginning with
All other identifiers are available, with no fear of unexpected collisions when moving programs from one compiler and library to another.
Note: in C++, identifiers with a double underscore anywhere are reserved everywhere; in C, only the ones that begin with a double underscore are reserved.
Translation limits
Even though there is no specific limit on the length of identifiers, early compilers had limits on the number of significant initial characters in identifiers and the linkers imposed stricter limits on the names with external linkage. C requires that at least the following limits are supported by any standard-compliant implementation:
|
(until C99) |
|
(since C99) |
References
- C11 standard (ISO/IEC 9899:2011):
- 5.2.4.1 Translation limits (p: 25-26)
- 6.4.2 Identifiers (p: 59-60)
- 6.10.8 Predefined macro names (p: 175-176)
- 6.11.9 Predefined macro names (p: 179)
- 7.31 Future library directions (p: 455-457)
- K.3.1.2 Reserved identifiers (p: 584)
- C99 standard (ISO/IEC 9899:1999):
- 5.2.4.1 Translation limits (p: 20-21)
- 6.4.2 Identifiers (p: 51-52)
- 6.10.8 Predefined macro names (p: 160-161)
- 6.11.9 Predefined macro names (p: 163)
- 7.26 Future library directions (p: 401-402)
- C89/C90 standard (ISO/IEC 9899:1990):
- 2.2.4.1 Translation limits
- 3.1.2 Identifiers
- 3.8.8 Predefined macro names
See Also
C++ documentation for Identifiers
|