【问题标题】:How does a C runtime library provided by a compiler say gcc alllows different function arguments & return types- float,double,long double?编译器提供的 C 运行时库如何说 gcc 允许不同的函数参数和返回类型 - float、double、long double?
【发布时间】:2011-11-03 14:01:03
【问题描述】:

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

【问题讨论】:

  • 函数名称不同,不需要重载。
  • 函数重载?在哪里?所有这些函数都有不同的名称...
  • 我想你可以称之为“显式名称修改”。 8v)
  • gcc 是用 C 和 C++ 实现的,我猜可能有一些汇编程序。
  • 函数目的相同,但仔细观察会发现,它们有不同的标识符,相似但不相等

标签: c compiler-construction standard-library


【解决方案1】:

函数名称的选择方式不同 - 普通的 sqrt 用于双精度,其朋友 sqrtfsqrtl 用于浮点和长双精度。看起来像重载,其实不然,因为函数名不同。

【讨论】:

  • 但在实际的函数调用中,我们不执行 sqrtf() 或 sqrtl().. 对吗?我们只是调用 sqrt() 但它的参数可以是 float,double,long double。我的查询是如何实现的。也许我没有使用正确的词。
  • 如果在函数调用中使用 sqrt,它的参数将被转换为 double。如果使用 sqrtf,则浮动。如果你想要长的双平方根计算,你必须在实际代码中使用 sqrtl。
【解决方案2】:

在 Windows 中,通常通过 #define 将函数名称重命名为特定类型来处理,具体取决于定义

例如

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 但在实际的函数调用中,我们不执行 sqrtf() 或 sqrtl().. 对吗?我们只是调用 sqrt() 但它的参数可以是 float,double,long double。我的查询是如何实现的。也许我没有使用正确的词。
    猜你喜欢
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    相关资源
    最近更新 更多