为什么这种区别? 我登陆了可怕的问题,假设itoa
是在stdlib.h
,最后用链接的定制版本结束了itoa
用不同的原型,并因此产生一些疯狂的错误。
那么,为什么不是itoa
不是标准的功能? 它出什么问题了? 为什么是标准的部分朝其孪生兄弟atoi
?
为什么这种区别? 我登陆了可怕的问题,假设itoa
是在stdlib.h
,最后用链接的定制版本结束了itoa
用不同的原型,并因此产生一些疯狂的错误。
那么,为什么不是itoa
不是标准的功能? 它出什么问题了? 为什么是标准的部分朝其孪生兄弟atoi
?
没有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);
微软提供了在他们的Visual C运行时库的改变名下: _itoa
。
不仅已C实现历史不同的定义下提供它,C 程序还提供了一个名为功能itoa
功能为自己,这是另一种来源为可能的冲突。
基本上, itoa
标识符为“放射性”关于标准化作为外部名称或宏。 如果这样的功能是标准化的,它必须是一个不同的名字。