Противоречит ли имя stdatomic.h (потенциальному) ограничению отображения до восьми значащих символов перед точкой?

ИСО/МЭК 9899:2011 (Е):

6.10.2.5

Реализация может игнорировать различия в алфавитном регистре и ограничивать отображение восемью значащими символами перед точкой.

Поскольку stdatomic.h имеет 9 символов перед точкой, противоречит ли это (потенциальному) ограничению выше? т.е. что некоторые реализации не будут различать stdatomic.h и (например) stdatomix.h при использовании их в качестве аргумента для директивы #include?

Дополнительный вопрос: почему stdatomic.h, а не atomic.h?


person pmor    schedule 23.02.2021    source источник
comment
Я бы сказал, что если в реализации есть stdatomic.h (7.17.1.2), то у нее не будет ограничения до 8 символов. Хорошо, если это вменяемая реализация.   -  person Eugene Sh.    schedule 23.02.2021
comment
Ограничения перевода C всегда были хаотичными. Стандарт определяет абсолютный минимум, но на практике полезные компиляторы намного превышают этот минимум. C90 имел 6 значащих начальных символов во внешнем идентификаторе, от которого просто хотелось кричать, о чем они думали!!! Этот текст, цитируемый здесь, также относится ко времени C90. Этому нет никакого объяснения, они просто не думали своим мозгом, когда устанавливали эти ограничения.   -  person Lundin    schedule 24.02.2021
comment
Забавно, однако, что C90 ограничил включение до 6 символов, а затем C99 расширил его до 8.   -  person Lundin    schedule 24.02.2021


Ответы (2)


Реализация может игнорировать различия в алфавитном регистре и ограничивать отображение восемью значащими символами перед точкой.

Поскольку stdatomic.h имеет 9 символов перед точкой, противоречит ли это (потенциальному) ограничению выше?

Нет, потому что, хотя в нем используется слово «ограничение», это не ограничение языка или реализации. Это свобода, предоставляемая реализациям.

т.е. что некоторые реализации не будут различать stdatomic.h и (например) stdatomix.h при использовании их в качестве аргумента для директивы #include?

То, что реализация не различает эти два имени в качестве включаемых файлов, никоим образом не приведет к несоответствию. Стандарт определяет особое значение директив включения формы

#include <stdatomic.h>

. Пока реализация признает эту директиву и придает ей требуемое значение, для стандарта не имеет значения, будет ли

#include <stdatomix.h>

придается одинаковое значение.

Дополнительный вопрос: почему stdatomic.h, а не atomic.h?

Общепринятым, хотя и не повсеместно соблюдаемым соглашением, является префикс std к именам заголовков стандартных библиотек. Другие примеры включают stdalign.h, stdarg.h, stdbool.h, stddef.h, stdint.h, stdio.h, stdlib.h и stdnoreturn.h. Я не уверен в политике комитета по этому поводу, но, безусловно, один из эффектов заключается в уменьшении вероятности того, что имя нового заголовка, добавленного в стандартную библиотеку, конфликтует с именами заголовков, используемых в существующих проектах.

person John Bollinger    schedule 23.02.2021
comment
1. В стандарте сказано: Реализация может... ограничивать сопоставление... Вы говорите: это не ограничение... на реализации. Я смущен. Можете ли вы уточнить? 2. Тогда почему не всем стандартным заголовкам предшествует префикс std (например, почему assert.h, а не stdassert.h)? - person pmor; 24.02.2021
comment
@pmor, это не ограничение на реализации. Это ограничение на поведение, которое программы могут полагаться на реализацию. Он предоставляет реализациям свободу либо различать stdatomic.h и stdatomix.h, либо нет, по своему выбору. Больше опций не является ограничением по отношению к меньшему количеству опций. - person John Bollinger; 24.02.2021
comment
Рассмотрим реализацию (компилятор C), работающую под ОС с FS, которая поддерживает имя файла с макс. 8 символов перед точкой. Что именно произойдет с #include <stdatomic.h>? Будет ли такая реализация знать о свойствах базовой ФС и, например, сопоставлять stdatomic.h, скажем, с x1v3J_Ko.h (любая последовательность из 8 символов, которая вряд ли появится в пользовательском пространстве), которая является именем файла для файла с содержание stdatomic.h? т.е. как такая реализация обеспечит гарантию того, что stdatomic.h будет включен, несмотря на ограничение базовой FS? - person pmor; 25.02.2021
comment
@pmor, реализация может делать все, что захочет или должна сделать, чтобы соответствовать, в том или ином случае. В частности, обратите внимание, что имена заголовков стандартных библиотек не обязательно должны совпадать с именами реальных файлов в любой файловой системе. Обратите внимание, что 6.10.2.5 — это enabler: он позволяет простые реализации C в файловых системах, которые вы описываете. То, что он это делает, само по себе не ограничивает какую-либо реализацию - если в этой области есть ограничение, то оно накладывается хост-средой, а не C. Ничто из этого не противоречит этому ответу. - person John Bollinger; 25.02.2021
comment
@pmor: для него естественно урезать имена. Таким образом, заголовок будет находиться в файле stdatomi.h в файловой системе, и включение любого из <stdatomic.h>, <stdatomix.h>, <stdatomi.h> или <stdatomiasdfjkl.h> будет включать его. - person Nate Eldredge; 25.02.2021
comment
@pmor: те, которые не начинаются с std, в основном появляются в более ранних версиях стандарта, чтобы соответствовать традиционному поведению или просто до того, как комитет решил серьезно отнестись к соблюдению соглашения std____. - person Nate Eldredge; 25.02.2021

Если вы используете #include <stdatomic.h>, заголовок библиотеки должен быть включен. Но можно сделать то же самое (или нет) с #include <stdatomi.h> или #include <stdatomix.h>.

Однако #include <stdatom.h> должен рассматриваться как другой файл. Но, с другой стороны, нет ничего, что прямо запрещало бы реализации иметь файл stdatom.h, единственным содержимым которого является #include <stdatomic.h>. Не то, чтобы любая реализация сделала это, но это разрешено.

Здесь нет настоящего противоречия. Просто смешное последствие.

person klutt    schedule 23.02.2021
comment
Стандарт гласит: Директива #include должна указывать заголовок или исходный файл, который может быть обработан реализацией. т.е. должен, а не должен. - person pmor; 24.02.2021
comment
@pmor Это как раз о темпусе. Я не вижу, чтобы это имело какое-либо значение. Или? - person klutt; 25.02.2021
comment
Стандарт (например, ISO/IEC 9899:202x (E)) имеет явное значение. Цитата из 4. Conformance: В этом документе должно интерпретироваться как требование к реализации или к программе; и наоборот, не следует интерпретировать как запрет. См. также: stackoverflow.com/a/6565606/1778275. - person pmor; 25.02.2021
comment
@pmor Достаточно честно. Не знал этого. Спасибо, я исправил это сейчас. - person klutt; 25.02.2021