【发布时间】:2013-09-04 02:00:09
【问题描述】:
我知道头文件有在“调用”#include 的.c 文件中使用的各种函数、结构等的前向声明,对吧?据我了解,“三权分立”是这样发生的:
头文件:func.h
-
包含函数的前向声明
int func(int i);
C源文件:func.c
-
包含实际的函数定义
#include "func.h" int func(int i) { return ++i ; }
C 源文件source.c(“实际”程序):
#include <stdio.h>
#include "func.h"
int main(void) {
int res = func(3);
printf("%i", res);
}
我的问题是:看到#include 只是一个编译器指令,它将.h 的内容复制到#include 所在的文件中,.c 文件如何知道如何实际执行功能?它得到的只是int func(int i);,那么它如何实际执行该功能呢?它如何访问func 的实际定义?标题是否包含某种“指针”,上面写着“那是我的定义,在那边!”?
它是如何工作的?
【问题讨论】:
-
这就是
Linker解析定义并确保您在编译期间声称存在的东西确实存在的魔力。 -
在处理头文件时,您可能想了解一下include guards。
-
我知道包含警卫(ifndef 就是这样),但为简洁起见省略了它们。
-
对我来说,您似乎认为 源代码 被用于执行程序,例如在脚本语言(JavaScript 等)中。事实并非如此。 C 源代码首先(由编译器和链接器)转换为机器代码,然后由处理器硬件直接执行。
-
你是什么意思,“源代码被用来执行程序”? C(或 GCC 实现)是编译的,而不是解释的。我知道它是提前编译成机器码的。它是用于生成机器代码的源代码。我不确定你的意思是什么。