当我在 Linux 上看到 man sqrt 时,我看到了该函数的 3 个原型 -
double sqrt(double x);
float sqrtf(float x);
long double sqrtl(long double x);
如果编译器/库是用 C++ 编写的,我知道它可能使用函数重载。
如果提供这个的编译器库是用C编写的,那么编译器(gcc)如何实现这种东西,就像C不支持的函数重载一样? (或者像 C99 这样的一些后来的 C 标准确实支持这样的东西吗?)
gcc 是用什么编程语言实现的?
函数名称只是选择不同 - 普通
sqrt
代表双精度,它的朋友 sqrtf
和 sqrtl
代表浮点数和长双精度。看起来像是重载,但其实不然,因为函数名称不同。
在 Windows 中,通常通过 #define 根据定义将函数名称重命名为特定类型来处理
例如
#ifdef UNICODE
#define strlen wcslen
#else
#define strlen strlen
#endif
在 C 或 C++ 中,这些不是相同的函数。 每个都有一个单独的变体。
在 C++(以及其他具有重载的语言)中,每个变体的名称可以相同,但编译器可以通过参数/返回值的类型将它们分开。 (事实上:在幕后,使用了一种自动生成的唯一名称,该名称是根据真实名称和参数类型构造的。所以它实际上不是同一个名称。)
在 C 中,名称不同,因此程序员、编译器和链接器之间的区别很清楚。