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

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

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

3 ответа

Решение

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

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

Функция itoa должна возвращать строку. Так как строки не являются объектами первого класса, вызывающая сторона должна будет передать буфер + длина, и у функции должен быть какой-то способ указать, исчерпано ли это место или нет. К тому времени, когда вы доберетесь до этого места, вы создали нечто настолько похожее на 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 идентификатор является "радиоактивным" в отношении стандартизации в качестве внешнего имени или макроса. Если такая функция стандартизирована, она должна быть под другим именем.

Другие вопросы по тегам