c中具有相同功能的两个声明

Paz*_*Paz 6 c

我在测试中遇到了这个问题,我仍然不明白给出的答案:

假设我写了以下代码:

#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)

让我们假设cossin在数学库中声明和定义(接收和返回double),并且我试图将我的代码与数学库链接起来.

另一个假设是cos定义于math.c.

问题是:

"代码是否会成功编译/链接?如果是,将调用哪个cos函数?"

答案是:

"是的,代码将编译,我的cos将被调用".

怎么解释这种行为?这些多个定义不是同一个函数吗?

Eri*_*hil 7

你的老师可能犯了一个错误并打算使用double cos(double x).在这种情况下,许多C实现将接受该程序,它将链接和运行,因为链接器从它提供的对象模块中获取每个模块,但只从它提供的库中获取所需的模块.因此,因为cos已经在程序中定义,链接器将不会从数学库中获取它.但是,尽管这在许多C实现中都有效,但它违反了标准C的规则,后者保留了库标识符; 普通程序可能无法定义它们.

另一种可能性是你的老师不想包括math.h.这将使声明cos不成为错误,因为它不会与另一个声明冲突,但这意味着sin程序也应声明它,因为它被使用.

  • @Paz:这取决于程序的链接方式.如果math.c被编译为math.o并链接,我希望链接器抱怨`cos`的多个定义.如果将math.o放入库中,例如libm.a,然后链接,我希望链接器只采用第一个定义而不是抱怨.在这种情况下,我会考虑更换老师可能是最好的选择. (2认同)