为什么要区别?我已经陷入了可怕的问题,假设itoa
位于stdlib.h
并最终将itoa
的自定义版本与不同的原型相关联,从而产生一些疯狂的错误。< / p>
那么,为什么itoa
不是标准函数呢?它出什么问题了?为什么标准偏向其孪生兄弟atoi
?
答案 0 :(得分:7)
没有itoa
已经标准化,因此要将其添加到标准中,您需要一个令人信服的理由和一个良好的界面来添加它。
我见过的大多数itoa
接口要么使用具有重入和生命周期问题的静态缓冲区,要分配调用者需要释放的动态缓冲区,或者要求用户提供一个缓冲区来构建接口不比sprintf
好。
答案 1 :(得分:2)
&#34; itoa&#34;函数必须返回一个字符串。由于字符串不是第一类对象,因此调用者必须传递缓冲区+长度,并且该函数必须有某种方式来指示它是否用完了房间。当你走到那么远的时候,你已经创建了类似于sprintf的东西,它不值得重复代码/功能。 &#34; atoi&#34;功能之所以存在,是因为它比完整的&#34; scanf&#34;更简单(并且可以说更安全)。呼叫。 &#34; itoa&#34;功能不会有足够的差异,不值得。
答案 2 :(得分:1)
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
标识符作为外部名称或宏标准化是“放射性的”。如果这样的功能是标准化的,则必须使用不同的名称