头文件和标准库

时间:2011-06-02 00:52:51

标签: c header

我是编程新手。到目前为止学习C.我知道头文件只包含声明和函数原型,而不是函数本身。我是对的吗?

我理解Library是一个包含不同对象代码的文件。这些目标代码是否必须仅以C语言编写,或者其他语言也可用于生成此类目标代码?

在链接时,整个库文件是附加到可执行文件还是只附加在头文件中声明的目标代码?

3 个答案:

答案 0 :(得分:9)

  

我只了解头文件   包含声明和函数   原型,而不是功能   自己。

通常,是的(虽然理论上你可以在头文件中放入你想要的任何代码)。请记住,头文件通常只是#include - d到源文件中,而#include基本上等同于复制和粘贴。

  

我知道图书馆是单个文件

不一定。 “库”有点松散,但一般来说,它用于描述一起执行一些有用的任务的函数集合(以及可能的数据)。这些功能可以在一个或多个源文件中定义。通常,库被预编译为独立目标文件。但同样,不一定。

  

这些目标代码是否必须仅以C语言编写

没有。它们可以用任何语言编写(因为它总是被编译成原始机器代码)。但是如果你想使用来自C的库,那么必须满足某些兼容性要求,以确保C编译器知道如何正确调用库函数。

  

在链接时,整个库文件是否附加到可执行文件

有时。这就是所谓的静态链接。另一个主要类型是动态链接,其中库对象代码在运行时链接。

答案 1 :(得分:3)

  

我知道头文件只包含声明和函数原型,而不包含函数本身。我是对的吗?

是的,在大多数情况下。代码可以出现在标题中,编译器将尝试“内联”(查看)。

  

这些目标代码是否必要   仅用C语言或其他语言编写   语言也可用于生成   这样的目标代码?

他们可以用任何编译语言编写,但最常见的是C和C ++。

  

整个库文件是否附加到可执行文件或只是头文件中声明的目标代码?

链接只告诉可执行文件如何调用底层的库代码,除非你进行“静态”链接,否则它不会“附加”库。

答案 2 :(得分:2)

头文件通常只包含声明和原型,但在现代C中,它可以包含“静态内联”函数及其定义。 (在C ++中,模板类通常在头文件中实现它们,但现在不用担心...)

库中的对象可以用任何语言编写;只要它们遵循“C链接”(本质上,在汇编级别调用和命名约定),它们就可以调用C函数并从中调用。例如,用汇编语言编写一些性能关键的库函数并不罕见。

您上一个问题的答案取决于链接器。我相信GNU ld包含所有.o文件的所有函数,其中任何函数都被引用,但说实话,我甚至不确定。你链接的大多数图书馆都是“共享图书馆”,这意味着你的问题的答案甚至都不重要。 (实际上,它通常并不重要,因为操作系统只会在实际访问时从磁盘加载页面。因此,磁盘上可执行文件的大小和运行时的RAM量可能非常非常不同。 )