为什么会有这种区别?我遇到了可怕的问题,假设我最终将自定义版本itoa
与不同的原型链接起来,从而产生了一些疯狂的错误。stdlib.h
itoa
那么,为什么不是itoa
标准功能呢?它出什么问题了?为什么标准偏向其孪生兄弟atoi
?
Noitoa
从未被标准化,因此要将其添加到标准中,您需要一个令人信服的理由和一个良好的界面来添加它。
我见过的大多数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
function 的函数,这是可能发生冲突的另一个来源。
基本上,itoa
就标准化作为外部名称或宏而言,标识符是“放射性的”。如果这样的功能是标准化的,它必须使用不同的名称。