我是C的新手。我正在通过math.h旅行,寻找它的数学算法,但只遇到这样的界限:
_CRTIMP double __cdecl sin (double);
_CRTIMP double __cdecl cos (double);
...
现在,我找不到算法本身。我知道_CRTIMP是C使用的一种运行时库,但我无法弄清楚整行是什么意思。请你解释一下吗?
此外,我想知道这些功能的定义在哪里。
答案 0 :(得分:5)
C标头通常只包含函数 prototype声明,而不包含 definitions 。函数原型指定所谓的“函数签名”:返回值,参数,有时调用约定(当编译器支持此时)。函数定义位于单独的源文件中,该文件与您自己的文件分开编译(包括源文件#include的任何头文件)。库函数的定义可能在C中,它们也可能在汇编中,但这对您的代码无关紧要(仅限于您的好奇心)。但是你可能不会自己编译那些;相反,您的开发环境/操作系统附带一个标准库(二进制目标文件),其中包含许多已编译的函数。您的开发环境只需将您的代码链接到该库。
答案 1 :(得分:3)
C头文件只包含函数声明,而不包含它们的定义。
您正在寻找math.h
中声明的函数的源代码,这是sin的一个实现:http://fxr.watson.org/fxr/source//arch/i386/math-emu/poly_sin.c?v=linux-2.4.22
答案 2 :(得分:2)
操作系统,编译器或C运行时库中包含的C头文件并非真正供人类使用。你当然可以阅读它们,你可以通过尝试理解它们来学习很多东西,但它们主要供编译器使用。正如您在这些示例中看到的那样,它们往往依赖于许多特定于编译器的功能(您应该在自己的代码中尝试避免这种习惯)。
它们也往往有很多#ifdef
个,所以相同的标题可以用于不同的系统。
例如,如果您只想知道如何使用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
函数的实现方式。知道这当然是一件好事,但是你不需要这些信息来编写使用它的代码。 (我绝对不想要劝阻好奇心。)