标准库中的某些功能似乎只是包装器或别名的原因是什么?

问题描述

当我研究了glibc的源代码时,有时会偶然发现那些包装函数,它们什么也不做,只能用作别名。例如:

int
rand (void)
{
  return (int) __random ();
}

出现这种情况的原因是什么?为什么不只将__random()的正文放入rand()中呢?

解决方法

这是一个非常个案的问题,因为这种行为有多种原因。一个答案不能涵盖所有情况的所有原因。

例如,某些编译器包含各种系统特定的“内置”实现,因此源/头文件只是告诉编译器将其实现放在其中。

另一个原因是将类型转换从更通用的函数转换为标准的符合类型。

某些函数包含重复的功能(请考虑printffprintf(stdin,...),并且使用包装器是保持代码更干燥的简单方法。

具体来说,__random返回一个long int,需要将其转换为int(取决于您的系统,它可能相同也可能不同)。

此外,__random重用了__random_r中的功能,但添加了一个锁以使功能线程安全。

以较小的变化(全局线程安全状态)重用相同的功能会使代码更加干燥。