Подтвердить что ты не робот

C длина имени включения источника

Согласно стандарту C, подпункт 6.10.2, пункт 5 [ISO/IEC 9899: 2011],

Реализация должна обеспечивать уникальные сопоставления для последовательностей состоящий из одного или нескольких недигитов или цифр (6.4.2.1), за которым следует период (.) и один недигит. Первый символ не должен быть цифра. Реализация может игнорировать различия в алфавитном случае и ограничить отображение восемью значимыми символами до период.

Это означало бы, что если два включенных файла имеют первые 8 символов, то заголовок, который он фактически выбирает, - undefined.

Когда я компилирую с помощью clang или gcc, я не сталкивался с этой проблемой. Однако существует ли документальное поведение для включения исходного файла в GCC и Clang?

В современном мире мне было бы странно, если бы какой-либо компилятор действительно ограничивал 8 символов.

Ссылка: C11 WG14 черновик версии N1570, Стандарт C сертификации Cert C

4b9b3361

Ответ 1

Это означало бы, что если два включенных файла имеют первые 8 символов, то заголовок, который он фактически выбирает, - undefined.

Нет, я бы возразил против этого: глядя на точную формулировку, мы видим, что стандарт использует:

[..] Реализация может игнорировать [..]

Это "может", а не "должно". Если бы последний был использован, это действительно означало бы, что поведение было undefined (N1570 $4/2). Поскольку "may" используется как есть, без точного объявления, я считаю безопасным принять нормальный смысл слова (источник, акцент мой)

используется для выражения возможности или разрешения

Таким образом, реализации разрешено рассматривать только первые 8 символов, но это не обязательно.

Смешная вещь: я не могу найти точную документацию для "предела разграничения" "последовательности" в руководстве GCC, то есть (N1570 $4/8, акцент мой)...

Реализация должна сопровождаться документом, который определяет все реализацию определенных и специфичных для локали характеристик и всех расширений.

... что GCC может (с некоторой педантичной точки зрения) считаться несоответствующей реализацией. Практически значимая часть их руководства, как отметил @PaulGriffiths, вероятно (источник, пункт 4 в списке):

Значительные начальные символы в имени идентификатора или макроса.

Препроцессор обрабатывает все символы как значимые. Стандарт C требует только того, чтобы первые 63 были значительными.

Относительно комментария:

[..] Я действительно пытаюсь оценить, будет ли это укусить меня, пока я использую один из этих компиляторов на платформе Linux. [..]

Я действительно сомневаюсь, что это когда-нибудь (опять?) будет проблемой.