我最近正在学习C语言。在这本书中提到:“编译器提供了这些库函数:'printf','scanf'…”。
我不理解。这些函数不是在头文件
为什么这本书解释这些函数由编译器提供?
我不理解。这些函数不是在头文件
<stdio.h>
中定义吗?为什么这本书解释这些函数由编译器提供?
<stdio.h>
中定义吗?printf
、scanf
和其他标准库函数都是C语言的一部分,是作为实现的一部分提供的。
C语言实现由多个组件组成。编译器只是其中之一。库是另一个组件;它包含头文件(通常以源代码文件的形式提供,如stdio.h
)和一些包含实际实现库函数代码的目标代码文件。
头文件stdio.h
仅声明这些函数;它不定义它们。例如,printf
的声明如下:
int printf(const char *format, ...);
printf的定义是实际执行解析格式字符串、访问参数并将格式化输出发送到stdout
的代码。这通常(但不一定)以C语言编写,并作为某种可链接目标代码提供。
对于某些C实现,编译器和库由同一组织提供。对于其他实现,它们可能是分别提供的(例如MinGW将gcc编译器与Microsoft的库结合在一起)。
这些函数是由标准库提供的,标准库是编译器作者通常编写的预编译代码集合(但它确实不是编译器本身的一部分)。
需要注意的是,这些函数仅在头文件中被声明。定义位于已经编译的源文件中。
<math.h>
可能除外(这取决于平台)。我从未需要使用 <tgmath.h>
,我不确定它们是与数学函数一起还是与其他函数一起。当数学库是单独的时,通常使用 -lm
加载,名称为 libm.a
或类似的名称 - 但库名称和扩展名因平台而异。Mac OS X 将数学函数放在主库中。_ [ ...继续... ] _ - Jonathan Leffler