第七章预处理与结构体十个问题及解答
1.预处理的定义是什么?
所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所做的工作。预处理是c语言的一个重要功能,它由预处理程序负责完成。当对一个源程序进行编译时,系统将自动引用预处理程序对源程序中的预处理部分进行处理,处理完毕自动进入对源程序的编译。
2.无参宏定义和带参宏定义的一般形式分别是什么?
无参宏定义:
#define 标识符 字符串
带参宏定义:
#define 宏名(形参表) 字符串
3.对于宏定义需要注意哪几点?
1)宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不做任何检查,如有错误,只能在编译已被宏展开后的源程序时发现。
2)宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。
3)宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。
4)宏名在源程序若用引号括起来,则预处理程序不对其进行宏代换。
5)宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。
6)对"输出格式"作宏定义,可以减少书写麻烦。
4.带参宏定义与自定义函数的区别?
1)在带参宏定义中,形式参数不分配内存单元,因此不必作类型定义,而宏调用中的实参有具体的值,要用它们去代换形参,因此必须作类型说明。而在函数中,形参与实参是两个不同的量,各有自己的作用域,调用时要把实参值赋予形参,进行"值传递"。而在代参宏中,只是符号代换,不存在值传递的问题。
2)在宏定义中的形参是标识符,而宏调用中的实参可以是表达式。
5.文件包含的功能是什么?
文件包含命令的功能是把指定的文件插入该命令行位置取代该命令行,从而把指定的文件和当前的源程序文件连成一个源文件。
6.文件包含需要注意什么?
1)包含命令中的文件名可以用双引号括起来,也可以用尖括号括起来。
2)一个include命令只能指定一个被包含文件,若有多个文件要包含,则需用多个include命令。
3)文件包含允许嵌套,即在一个被包含的文件中又可以包含另一个文件。
7.结构体和数组的的比较?
1)都由元素组成。
2)各个元素在内存中的存储空间是连续的。
3)数组中各个元素的类型相同,而结构体中的各个元素的数据类型可以不相同。
8.#define和 typedef 的区别?
#define定义 可读 的常量和一些宏语句,而typedef则常用来定义关键字,冗长的类型的别名。宏定义只是简单的字符串代换(原地扩展),而typedef则不是原地扩展,它的新名字具有一定的封装性,以致新命名的标识符具有更容易定义变量的功能。
9.结构体和联合体的区别?
结构体和联合体都是由多个不同的数据类型成员组成的,但在任何同一时刻,联合体中只存放了一个被选中的成员,而结构体的所有成员都存在,在结构体中,各成员都占有自己的内存空间,他们是同时存在的,一个结构体变量的总长度等于所有成员长度之和。在联合体中,所有成员不能同时占用它的内存空间,他们不能同时存在,联合体变量的长度等于最长的成员的长度。
10.什么是位段?
位段是以位为单位来定义结构体(或联合体)中的成员变量所占的空间,含有位段的结构体(或联合体)称为位段结构,采用位段结构既能够节省空间,又方便操作。
一般格式:
type [var]: digits