我在测试中遇到了这个问题,我仍然不明白给出的答案:
假设我写了以下代码:
#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));
}
Run Code Online (Sandbox Code Playgroud)
让我们假设cos
并sin
在数学库中声明和定义(接收和返回double
),并且我试图将我的代码与数学库链接起来.
另一个假设是cos
定义于math.c
.
问题是:
"代码是否会成功编译/链接?如果是,将调用哪个cos函数?"
答案是:
"是的,代码将编译,我的cos将被调用".
怎么解释这种行为?这些多个定义不是同一个函数吗?
你的老师可能犯了一个错误并打算使用double cos(double x)
.在这种情况下,许多C实现将接受该程序,它将链接和运行,因为链接器从它提供的对象模块中获取每个模块,但只从它提供的库中获取所需的模块.因此,因为cos
已经在程序中定义,链接器将不会从数学库中获取它.但是,尽管这在许多C实现中都有效,但它违反了标准C的规则,后者保留了库标识符; 普通程序可能无法定义它们.
另一种可能性是你的老师不想包括math.h
.这将使声明cos
不成为错误,因为它不会与另一个声明冲突,但这意味着sin
程序也应声明它,因为它被使用.