The corresponding implementation must support at least 31 characters for the external identifier (and your identifiers are internal, where the limit is 63 for C99 and C11).
In fact, the presence of all significant characters is the purpose of the standard, but the committee does not want implementations to be inconsistent without providing it. Limitations on external identifiers come from some linkers that cannot provide more (only 6 characters are required on C89, so the old standard library functions have names no more than 6 characters).
To be precise, the standard does not precisely define these limits; the language in the standard is quite permissive:
C11 (n1570) 5.2.4.1 Translation restrictions
An implementation must be able to translate and execute at least one program containing at least one instance of each of the following restrictions: 18)
- [...]
- 63 important leading characters in the internal identifier or macro name (each generic character name or extended source character is considered a single character)
- 31 significant leading characters in the external identifier (each universal symbol name defining a short identifier 0000FFFF or less is considered 6 characters, each universal symbol name defining a short identifier 00010000 or more is considered 10 characters, and each extended source symbol is considered the same number of characters , as the corresponding universal symbol name, if any) 19)
- [...]
Footnote 18) clearly expresses the intention:
Implementations should avoid introducing fixed translation restrictions when possible.
Footnote 19) refers to the linguistic directions of the future 6.11.3:
Limiting the significance of an external name to less than 255 characters (taking into account each universal symbol name or extended source symbol as a single symbol) is an obsolete function, a concession to existing implementations.
And to explain permissiveness in the first sentence 5.2.4.1, cf. Justification C99 (5.10)
5.2.4 Environmental restrictions
The C89 agreed that the standard should say something about certain opportunities and limitations, but only how to ensure compliance with these clauses of the contract was the subject of serious discussion.
5.2.4.1 Translation restrictions
The standard requires that an implementation can translate and execute some program that meets each of the specified limits. It was believed that this criterion gives useful freedom to the developer in reaching these limits. Although insufficient implementation could probably develop a program that satisfies this requirement, but still succeeds in being useless, the C89 Committee considered that such ingenuity would probably require more work than something useful. The meaning of both the C89 and C99 committees was that developers should not interpret translation limits as values ββof hard parameters, but rather as a set of criteria by which implementation will be evaluated.