Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解C头语法_C_Algorithm_Header_Math.h - Fatal编程技术网

理解C头语法

理解C头语法,c,algorithm,header,math.h,C,Algorithm,Header,Math.h,我是C的新手。我在math.h中旅行,寻找它的数学算法,但只遇到这样的行: _CRTIMP double __cdecl sin (double); _CRTIMP double __cdecl cos (double); ... 现在,我找不到算法本身。我知道CRTIMP是C使用的一种运行时库,但我就是搞不懂整行的意思。你能解释一下吗 此外,我想知道这些函数在哪里定义。C头文件只包含函数声明,而不包含它们的定义 您正在查找在math.h中声明的函数的源代码,下面是sin的一个实现:C头通常只

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

_CRTIMP double __cdecl sin (double);
_CRTIMP double __cdecl cos (double);
...
现在,我找不到算法本身。我知道CRTIMP是C使用的一种运行时库,但我就是搞不懂整行的意思。你能解释一下吗


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

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


您正在查找在
math.h
中声明的函数的源代码,下面是sin的一个实现:

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

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

它们还往往有大量的ifdef,因此相同的头可以用于不同的系统

例如,如果您只想知道如何使用
sin
函数,最好阅读系统文档。例如,在我的Ubuntu系统上,
mansin
显示了以下内容:

概要

   #include <math.h>

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

   Link with -lm.
#包括
双sin(双x);
浮动sinf(浮动x);
长双正弦(长双x);
链接到-lm。
\u CRTIMP
\u cdecl
可能对编译器很重要,但作为程序员,您可以放心地忽略它们

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

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


而且,您不必太拘泥于
sin
函数的实现方式。这当然是一件好事,但您不需要这些信息来编写使用这些信息的代码。(我绝对不想打消好奇心。)

第一个谷歌链接:你的答案是:
\u CRTIMP只是一个宏,它可能会扩展到一些非标准的调用约定规范,也可能什么都没有,这取决于。“CRT”可能意味着“C运行时库”。“IMP”可能意味着“进口”__CDECL是VisualC++和其他一些Windows C++编译器支持的调用约定说明符。
cos(double)
在哪里存在?函数本身在哪里?顺便说一句,我访问了这个链接)@MichaelSazonov标题只告诉你哪些函数和数据可用;定义本身在别处(在本例中是C标准库(msvcrt32.dll或类似的东西))查看头是一个痛苦的过程。它们通常带有宏和ifdef,以便使相同的头在不同的情况下(o/s版本、标准版本、编译选项)执行不同的操作,而不必为每个需求的变化写下所有内容。这也是一个很好的答案!清清楚楚!非常感谢你!