atoi – стандартная функция. Но это не так. Зачем?

Почему это различие? Я приземлился с ужасными проблемами, предполагая, что itoa будет в stdlib.h и, наконец, в конечном итоге со ссылкой на пользовательскую версию itoa с другим прототипом и, таким образом, создаст некоторые сумасшедшие ошибки.

Итак, почему это не стандартная функция? Что с этим не так? И почему стандарт является частичным по отношению к его брату-близнецу?

itoa никогда не был стандартизирован, поэтому, чтобы добавить его к стандарту, вам понадобится убедительная причина и хороший интерфейс для его добавления.

Большинство интерфейсов itoa которые я видел, либо используют статический буфер, у которого есть проблемы с повторным подключением и жизненным циклом, выделяют динамический буфер, который вызывающий должен освободить, или потребовать от пользователя предоставления буфера, который делает интерфейс не лучше, чем sprintf .

Функция «itoa» должна была бы вернуть строку. Поскольку строки не являются первоclassными объектами, вызывающему нужно будет передать длину буфера +, и функция должна будет каким-то образом указать, закончилась ли она или нет. К тому времени, когда вы доберетесь до этого, вы создали нечто подобное достаточно для sprintf, что не стоит дублировать код / ​​функциональность. Функция «atoi» существует, потому что она менее сложна (и, возможно, более безопасна), чем полный вызов «scanf». Функция «itoa» не была бы достаточно разной, чтобы стоить того.

Функция itoa не является стандартной, по всей видимости, потому что нет последовательного определения ее. Различные поставщики компиляторов и библиотек ввели тонко разные версии, возможно, в качестве изобретения, чтобы служить дополнением к atoi .

Если какая-то нестандартная функция широко предоставляется поставщиками, то задача стандарта заключается в ее кодификации : в основном добавить описание существующей функции к стандарту. Это возможно, если функция имеет более или менее согласованные условные условные обозначения и поведение.

Поскольку уже существует несколько разновидностей itoa , такая функция не может быть добавлена ​​в ISO C. Независимо от того, какое поведение описано, это будет противоречить некоторым реализациям.

itoa существует в таких формах, как:

 void itoa(int n, char *s); /* Given in _The C Programming Language_, 1st ed. (K&R1) */ void itoa(int input, void (*subr)(char)); /* Ancient Unix library */ void itoa(int n, char *buf, int radix); char *itoa(int in, char *buf, int radix); 

Microsoft предоставляет его в своей библиотеке времени выполнения Visual C под измененным именем: _itoa .

Не только реализация C исторически предоставляла его под разными определениями, программы C также предоставляют для себя функцию с именем itoa , что является еще одним источником возможных столкновений.

В принципе, идентификатор itoa является «радиоактивным» в отношении стандартизации в качестве внешнего имени или макроса. Если такая функция стандартизирована, она должна быть под другим именем.