编译器提供的 C 运行时库如何说 gcc 包含不同的函数参数和返回类型 - 浮点型、双精度型、长型双精度?



当我在Linux上看到man sqrt时,我看到了这个函数的3个原型-

double sqrt(double x);    
float sqrtf(float x);    
long double sqrtl(long double x);

如果编译器/库是用c++编写的,我理解它可能使用函数重载。

如果提供此功能的编译器库是用C编写的,那么编译器(gcc)如何实现这种东西,就像C不支持的函数重载一样?(或者是后来的C标准,比如C99,支持这样的东西?)

gcc是用什么编程语言实现的?

函数名只是选择了不同的名称-普通的sqrt用于双精度,它的朋友sqrtfsqrtl用于浮点数和长双精度。它看起来像重载,但它不是,因为函数名不同。

在Windows中,它通常通过使用#define来根据定义将函数名重命名为特定类型来处理

#ifdef UNICODE
#define strlen wcslen
#else
#define strlen strlen
#endif

在C或c++中,这些都不是相同的函数。你有一个单独的变体。

在c++(和其他有重载的语言)中,每个变量的名称可以相同,但编译器可以通过参数/返回值的类型将它们分开。(事实上:在底层使用了一种自动生成的唯一名称,该名称由真实名称和参数类型构造而成。所以这不是一个真正的名字。)

在C语言中,这些名称是不同的,因此程序员,编译器和链接器都可以清楚地区分它们。

最新更新