【发布时间】:2014-01-22 14:31:51
【问题描述】:
我在测试中遇到了这个问题,但我仍然不明白给出的答案:
假设我写了以下代码:
#include <math.h>
#include <stdio.h>
float cos(float x){
return 1-x*x/4;
}
int main()
{
printf("%0f",cos(0.05f)+sin(0.05f));
}
假设cos 和sin 在数学库中声明和定义(接收和返回double),我正在尝试将我的代码与数学库链接。
另一个假设是cos 是在math.c 中定义的。
问题是:
"代码会编译/链接成功吗?如果是,是哪个cos函数 会被调用吗?”
答案是:
“是的,代码会编译,我的cos会被调用”。
如何解释这种行为?这不是同一个函数的多个定义吗?
【问题讨论】:
-
你是如何得到答案的
""Yes, the code will compile and my cos will be called""? -
@Brandin 那是老师的解决方案。
-
@Brandin:它不依赖于实现,cos 是标准函数,C 中不允许重载。
-
你的老师可能弄错了,打算使用
double cos(double x)。在这种情况下,许多 C 实现将接受该程序,并且它将链接并运行,因为链接器从它提供的对象模块中获取 每个 模块,但只获取 需要的它提供的库中的模块。因此,因为cos已经在程序中定义,链接器不会从数学库中获取它。然而,尽管这在许多 C 实现中都有效,但它违反了标准 C 的规则,即保留库标识符;普通程序可能不会定义它们。 -
@EricPostpischil:我会让你的评论成为答案。我认为你已经一针见血了。
标签: c