我有两个疑问:
Spo*_*ook 10
C和C++是语言,广泛使用称为函数转发的功能.这意味着,您可以说,例如:
void f(int i); /* note the semicolon */
Run Code Online (Sandbox Code Playgroud)
这意味着:"我保证,有些人会在源代码中稍后定义,函数f实际上做了什么".在这样的转发之后,您可以使用此函数,因为它确实存在,编译器将要求某人以后实际定义此函数(如果没有定义,编译将失败).此转发也称为标头,因为它实际上是函数定义的标头:
void f(int i) /* Header */
/* Body */
{
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
头文件是一个文件,主要包含此类转发.您可以使用头文件来访问其他位置定义的函数(例如,在不同的编译单元或外部库中),然后附加所需的目标文件或库以提供这些头文件的实现.除了函数转发之外,在头文件中还可以找到正确使用已定义函数所需的结构定义,常量或其他项.
编译器如何将您的转发与.c文件中的实际实现相匹配?简单地说 - 通过标题.它试图找到一个函数定义(实现),它与您之前声明的头完全匹配.
如果你的#include头文件是编译器(特别是预处理器)将头文件的全部内容复制到位,你把你的文件放在哪里会发生什么#include.这都是魔术,没有更多的事情发生.
在运行时,头文件根本不重要,因为您的可执行文件只包含可执行代码.编译器要么加载库中可用的所有函数(可以通过头文件访问),要么(如果打开优化,则很可能)只选择您在代码中实际使用的这些函数.
有趣的是,只有当某人实际使用该功能时,编译器才需要函数定义(实现).否则,前转将被忽略.尝试:
void f(int i);
int main(int argc, char ** argv)
{
/* Do not use f here */
return 0;
}
Run Code Online (Sandbox Code Playgroud)
头文件实际包含什么?所有的函数定义还是只有原型声明?
头文件包含函数声明,外部变量,宏,结构等.最佳做法是保持函数定义在.c文件中.
当我包含头文件时会发生什么?是否将头文件的所有内容附加到我的代码中?或者是否将头文件的特定(或全部)内容加载到内存中并根据我的代码调用函数?
头文件只不过是在你使用的地方插入它们的内容#include.如果您愿意,您可以自己编写所有内容.
包含头文件等于复制头文件的内容,但我们不这样做,因为它会非常容易出错,并且在源文件中复制头文件的内容不是一个好主意,特别是我们有多个源文件,包含我们的程序.
编辑:
有关完整执行程序的内存布局,请访问此链接http://fgiasson.com/articles/memorylayout.txt
| 归档时间: |
|
| 查看次数: |
3779 次 |
| 最近记录: |