理解C头语法

时间:2012-01-29 00:12:57

标签: c algorithm header math.h

我是C的新手。我正在通过math.h旅行,寻找它的数学算法,但只遇到这样的界限:

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

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

此外,我想知道这些功能的定义在哪里。

3 个答案:

答案 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函数的实现方式。知道这当然是一件好事,但是你不需要这些信息来编写使用它的代码。 (我绝对想要劝阻好奇心。)