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:
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.
The following identifiers are reserved and may not be declared in a program (doing so invokes undefined behavior):
cerf, cerfc, cexp2, cexpm1, clog10, clog1p, clog2, clgamma, ctgamma and their -f and -l suffixed variants, in <complex.h> is or to followed by a lowercase letter, in <ctype.h> and <wctype.h> str followed by a lowercase letter, in <stdlib.h> str, mem or wcs followed by a lowercase letter, in <string.h> wcs followed by a lowercase letter, in <wchar.h> atomic_ followed by a lowercase letter, in <stdatomic.h> cnd_, mtx_, thrd_ or tss_ followed by a lowercase letter, in <threads.h> int or uint and ending with _t, in <stdint.h> atomic_ or memory_ followed by a lowercase letter, in <stdatomic.h> cnd_, mtx_, thrd_ or tss_ followed by a lowercase letter, in <threads.h> E followed by a digit or an uppercase letter, in <errno.h> FE_ followed by an uppercase letter, in <fenv.h> INT or UINT and ending with _MAX, _MIN, or _C, in <stdint.h> PRI or SCN followed by lowercase letter or the letter X, in <stdint.h> LC_ followed by an uppercase letter, in <locale.h> SIG or SIG_ followed by an uppercase letter, in <signal.h> TIME_ followed by an uppercase letter, in <time.h> ATOMIC_ followed by an uppercase letter, in <stdatomic.h> memory_order_ followed by a lowercase letter, in <stdatomic.h> cnd_, mtx_, thrd_ or tss_ followed by a lowercase letter, in <threads.h>
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.
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) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
http://en.cppreference.com/w/c/language/identifier