Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C source inclusion name length

Tags:

c

gcc

clang

According to the C Standard, subclause 6.10.2, paragraph 5 [ISO/IEC 9899:2011],

The implementation shall provide unique mappings for sequences consisting of one or more nondigits or digits (6.4.2.1) followed by a period (.) and a single nondigit. The first character shall not be a digit. The implementation may ignore distinctions of alphabetical case and restrict the mapping to eight significant characters before the period.

This would mean that if two include files have first 8 characters in common, the header it actually picks is undefined.

When I compile using clang or gcc, I haven't really faced this issue. However, is there a documented behavior for source file inclusion in GCC and Clang?

In the modern world, I would find it weird if any compiler really restricts to 8 characters.

Reference: C11 WG14 draft version N1570, Cert C Coding standard

like image 1000
neorg Avatar asked Sep 15 '16 10:09

neorg


1 Answers

This would mean that if two include files have first 8 characters in common, the header it actually picks is undefined.

No, I'd argue against that: Looking at the exact wording we see that standard uses:

[..] The implementation may ignore [..]

It's "may", not "shall". If the later was used it would indeed mean that the behavior was undefined (N1570 $4/2). Since "may" is used as-is, without exact declaration I think it's safe to assume the normal meaning of the word (source, emphasis mine):

used to express opportunity or permission

Thus, an implementation is allowed to only consider the first 8 characters, but it doesn't have to.

Funny thing: I cannot find an exact documentation for the "distinction limit" of the "sequence" in GCC's manual, meaning (N1570 $4/8, emphasis mine) ...

An implementation shall be accompanied by a document that defines all implementation defined and locale-specific characteristics and all extensions.

... that GCC could (under some very pedantic point of view) be considered a nonconforming implementation. The practical relevant part of their manual, as @PaulGriffiths pointed out, is probably (source, point 4 in the list):

Significant initial characters in an identifier or macro name.

The preprocessor treats all characters as significant. The C standard requires only that the first 63 be significant.

Regarding the comment:

[..] I am actually trying to evaluate if this will bite me as long as I am using one of these compilers on a Linux platform. [..]

I really doubt that this will ever (again?) be an issue.

like image 93
Daniel Jour Avatar answered Oct 20 '22 20:10

Daniel Jour