2

我是 C 的新手。我正在浏览 math.h,寻找它的数学算法,但只遇到了这种行:

_CRTIMP double __cdecl sin (double);
_CRTIMP double __cdecl cos (double);
...

现在,我找不到算法本身。我知道 _CRTIMP 是 C 使用的一种运行时库,但我就是不知道整行是什么意思。请你解释一下好吗?

此外,我想知道这些函数是在哪里定义的。

4

3 回答 3

5

C 头文件通常只包含函数原型声明,而不是定义。函数原型指定了所谓的“函数签名”:返回值、参数,有时还有调用约定(编译器何时何地支持这一点)。函数定义位于单独的源文件中,该文件与您自己的文件分开编译(包括源文件#include 的任何头文件)。库函数的定义可能在 C 中,也可能在汇编中,但这对您的代码无关紧要(仅出于您的好奇心)。但是您可能无论如何都不会自己编译它们;相反,您的开发环境/操作系统带有一个标准库(二进制目标文件),其中包含许多已编译的函数。您的代码链接到该库。

于 2012-01-29T00:34:17.297 回答
3

C 头文件将只包含函数的声明,而不包含它们的定义。

您正在寻找 中声明的函数的源代码math.h,这是 sin 的一种实现:http: //fxr.watson.org/fxr/source//arch/i386/math-emu/poly_sin.c?v =linux -2.4.22

于 2012-01-29T00:25:13.713 回答
2

操作系统、编译器或 C 运行时库中包含的 C 头文件并不是真正供人类使用的。您当然可以阅读它们,并且通过尝试理解它们可以学到很多东西,但它们主要是供编译器使用的。正如您在这些示例中所看到的,它们往往依赖于许多特定于编译器的功能(您应该在自己的代码中尽量避免这种习惯)。

它们也往往有很多#ifdefs,因此相同的标头可以用于不同的系统。

例如,如果您只想知道如何使用该sin功能,最好阅读系统文档。例如,在我的 Ubuntu 系统上,man sin显示了这一点(除其他外):

概要

   #include <math.h>

   double sin(double x);
   float sinf(float x);
   long double sinl(long double x);

   Link with -lm.

和可能对编译_CRTIMP__cdecl很重要,但作为程序员,您可以放心地忽略它们。

如果您正在寻找实现sin功能的源代码,那么它可能可用也可能不可用。它可能是用 C 以外的语言编写的;甚至有一些系统是在硬件中实现的(尽管仍然需要一个小的包装器)。

另一个答案提供了一个实现的链接,但这可能不是您系统上使用的那个。

而且您不必太纠结于该sin功能的实现方式。知道这当然是一件好事,但您不需要这些信息来编写使用它的代码。(我绝对不想阻止好奇心。)

于 2012-01-29T00:47:28.553 回答