编译器提供的 C 运行时库如何表示 gcc 允许不同的函数参数和返回类型 - float、double、long double?

问题描述 投票:0回答:3

当我在 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 是用什么编程语言实现的?

c standard-library
3个回答
5
投票

函数名称只是选择不同 - 普通

sqrt
代表双精度,它的朋友
sqrtf
sqrtl
代表浮点数和长双精度。看起来像是重载,但其实不然,因为函数名称不同。


0
投票

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

例如

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

0
投票

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

在 C++(以及其他具有重载的语言)中,每个变体的名称可以相同,但编译器可以通过参数/返回值的类型将它们分开。 (事实上:在幕后,使用了一种自动生成的唯一名称,该名称是根据真实名称和参数类型构造的。所以它实际上不是同一个名称。)

在 C 中,名称不同,因此程序员、编译器和链接器之间的区别很清楚。

© www.soinside.com 2019 - 2024. All rights reserved.