首页 > 试题广场 >

下面哪个阶段可以发现被调用的函数未定义?

[单选题]
由多个源文件组成的C程序,经过编辑、预处理、编译,链接等阶段会生成最终的可执行程序。下面哪个阶段可以发现被调用的函数未定义?
  • 预处理
  • 编译
  • 链接
  • 执行
推荐
答案:C
A: 预处理 C 语言程序从源代码变成可执行程序的第一步,主要是 C 语言编译器对各种预处理命令进行处理包括头文件的包含、宏定义的扩展、条件编译的选择等
B: 编译之前,C 语言编译器会进行词法分析、语法分析 (-fsyntax-only) ,接着会把源代码翻译成中间语言,即汇编语言 编译程序工作时,先分析,后综合,从而得到目标程序。所谓分析,是指词法分析和语法分析;所谓综合是指代码优化,存储分配和代码生成。 值得一提的是,大多数的编译程序直接产生机器语言的目标代码,形成可执行的目标文件,但也有的编译程序则先产生汇编语言一级的符号代码文件,然后再调用汇编程序进行翻译加工处理,最后产生可执行的机器语言目标文件。 
C: 链接是处理可重定位文件,把它们的各种符号引用和符号定义转换为可执行文件中的合适信息( 一般是虚拟内存地址 ) 的过程。
编辑于 2016-03-15 11:37:52 回复(1)
编译时只是把函数的符号地址记录下来,链接时该函数符号有定义才会变成具体的地址。如果链接过程中所有符号都有定义,链接成功,生成可执行文件;否则链接失败。
发表于 2015-10-03 10:17:18 回复(0)
//预处理:处理#include、宏替换和条件编译
//编译:生成目标文件(.cpp->.o)
//链接:链接多个目标文件
//例子:
//main.cpp
int main(){
    fun();
}
//编译不可通过,提示函数fun()未声明
void fun();
int main(){
    fun();
}
//编译可通过,链接不可通过,提示函数fun()未定义

发表于 2015-10-29 13:13:59 回复(6)
选择C,链接

一般说来编译器会做以下几个过程:

 1.预处理阶段 ,处理宏定义、库引用,声明等。

2. 编译阶段,进行 词法与语法分析, 首先编译成纯汇编语句,再将之汇编成跟CPU相关的二进制码,生成各个目标文件

 4.连接阶段, 到了链接阶段才会知道各个函数的调用关系,才能出现调用某个函数,但是该函数没有声明找不到的情况。
发表于 2016-03-20 16:51:26 回复(0)
他们解释都太多了,这里应该是4步:
1、预处理:头文件展开、宏定义展开、条件编译等,不做语法检查
2、编译:检查语法,将预处理后文件编译生成汇编文件

3、汇编:将汇编文件生成目标文件(二进制文件)
4、链接:C语言写的程序是需要依赖各种库的,所以编译之后还需要把库链接到最终的可执行程序中去
找不到函数都会去依赖库中找,最终找不到,报错!


发表于 2018-01-04 19:22:45 回复(0)
链接阶段是把编译后得到的各个模块以及所需要的库函数连接在一起,形成一个完整的装入模块。所以这个题,如果被调用的函数在其他模块这时就会发现函数未定义。
此外这个题要注意函数的声明和定义不是一回事。
编辑于 2019-08-03 21:35:12 回复(0)

连接阶段:

假如一个程序包含多个文件,在分别对每个源程序进行编译并得到多个目标程序后,要把这些目标程序连接起来,同时还要同系统提供的资源(如函数库)连接成为一个整体,如果不出现错误,会得到一个后缀为 .exe的可执行文件

发表于 2015-09-15 15:57:34 回复(1)
注意题目中问的是函数定义的检查,不是头文件的包含。所在是在链接阶段会报错。
发表于 2016-09-09 15:30:09 回复(0)
编译时只是把函数的符号地址记录下来,链接时该函数符号有定义才会变成具体的地址。如果链接过程中所有符号都有定义,链接成功,生成可执行文件;否则链接失败。
发表于 2018-11-23 11:00:47 回复(0)
编译生成目标文件(.o),链接生成多个可执行文件;预处理负责头文件的包含,宏展开,条件编译的选择。@Presen..."编译时只是把函数的符号地址记录下来,链接时该函数符号有定义才会变成具体的地址。如果链接过程中所有符号都有定义,链接成功,生成可执行文件;否则链接失败。"
编辑于 2018-03-11 12:22:37 回复(0)

选择C 链接

A预处理:

  • 读取C源程序,对其中的伪指令(以#开头的指令)进行处理
    ①将所有的“#define”删除,并且展开所有的宏定义

    ②处理所有的条件编译指令,如:“#if”、“#ifdef”、“#elif”、“#else”、“endif”等。这些伪指令的引入使得程序员可以通过定义不同的宏来决定编译程序对哪些代码进行处理。预编译程序将根据有关的文件,将那些不必要的代码过滤掉。

    ③处理“#include”预编译指令,将被包含的文件插入到该预编译指令的位置。

(注意:这个过程可能是递归进行的,也就是说被包含的文件可能还包含其他文件)

  • 删除所有注释
  • 添加行号和文件名标识
    以便于编译时编译器产生调试用的行号信息及用于编译时产生的编译错误或警告时能够显示行号
  • 保留所有的#pragma编译器指令

B编译:

将预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后,产生相应的汇编代码文件。

C链接:

通过链接器将一个个目标文件(或许还会有库文件)链接在一起生成一个完整的可执行程序

由汇编程序生成的目标文件并不能立即就被执行,其中可能还有许多没有解决的问题。

例如,某个源文件中的函数可能引用了另一个源文件中定义的某个符号(如变量或者函数调用等);在程序中可能调用了某个库文件中的函数,等等。所有的这些问题,都需要经链接程序的处理方能得以解决。
链接程序的主要工作就是将有关的目标文件彼此相连接,也就是将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够***作系统装入执行的统一整体

来自:http://www.cnblogs.com/Lynn-Zhang/p/5377024.html

发表于 2017-09-27 21:20:27 回复(0)
题目刚开始说了有多个源文件,不是在一个源文件中。
发表于 2015-10-20 10:17:58 回复(0)
是链接阶段
发表于 2015-09-30 10:56:40 回复(0)
编译的时候吧。
1.预处理  这个阶段用来处理所有的预处理指令 - 主要是一些宏替换,头文件导入
2.编译	 对预处理后的代码进行翻译工作,得到计算机
		所认识的格式编译工作得到的结果文件叫做目标文件,
		扩展名是.o(编译得到汇编文件(.s) ->经过汇编后得到.o目标文件)
3.链接  把所有的目标文件和其他必要的文件合并在一起
	得到最终的可执行文件
发表于 2015-09-16 18:14:05 回复(0)
b
发表于 2015-09-15 17:30:30 回复(0)