由多个源文件组成的C程序,经过编辑、预处理、编译,链接等阶段会生成最终的可执行程序。下面哪个阶段可以发现被调用的函数未定义?
A、预处理
B、编译
C、链接
D、执行
A:
预处理是
C
语言程序从源代码变成可执行程序的第一步,主要是
C
语言编译器对各种预处理命令进行处理,包括头文件的包含、宏定义的扩展、条件编译的选择等。
B:
编译之前,C
语言编译器会进行词法分析、语法分析
(-fsyntax-only) 、语义分析
,接着会把源代码翻译成中间语言,即汇编语言
。
编译程序工作时,先分析,后综合,从而得到目标程序。所谓分析,是指词法分析和语法分析;所谓综合是指代码优化,存储分配和代码生成。
值得一提的是,大多数的编译程序直接产生机器语言的目标代码,形成可执行的目标文件,但也有的编译程序则先产生汇编语言一级的符号代码文件,然后再调用汇编程序进行翻译加工处理,最后产生可执行的机器语言目标文件。
C:
链接是处理可重定位文件,把它们的各种符号引用和符号定义转换为可执行文件中的合适信息(
一般是虚拟内存地址
)
的过程。假如一个程序包含多个文件,在分别对每个源程序进行编译并得到多个目标程序后,要把这些目标程序连接起来,同时还要同系统提供的资源(如函数库)连接成为一个整体,如果不出现错误,会得到一个后缀为 .exe的可执行文件
到了链接阶段才会知道各个函数的调用关系,才能出现调用某个函数,但是该函数没有声明找不到的情况。
addition:
1、涉及要内存分配的地方,一般是在程序执行的时候才分配相应的空间,否则分配内存有什么用呢。mallocd 在堆上动态分配内存,在运行时期。