4.10编译预处理 所谓编译预处理就是编译器在对源程序进行正式编译前,根据 预处理指令先做一些特殊的处理工作,然后将源程序与预处理 的结果一起进行编译。 C++语言的预处理主要包括3方面的操作:嵌入指令、宏定 义和条件编译指令 应当说明的是,编译预处理指令不属于++语言的语法范畴。 因此,预处理指令具有其特有语法:起始字符必须为“#, 并以“回车”结束
4.10 编译预处理 所谓编译预处理就是编译器在对源程序进行正式编译前,根据 预处理指令先做一些特殊的处理工作,然后将源程序与预处理 的结果一起进行编译。 C++ 语言的预处理主要包括 3 方面的操作:嵌入指令、宏定 义和条件编译指令。 应当说明的是,编译预处理指令不属于 C++ 语言的语法范畴。 因此,预处理指令具有其特有语法:起始字符必须为 “#”, 并以“回车”结束
10.1嵌入指令 嵌入指令的一般形式为: Include <file name> d #include"file name 其中: file name是一个可以带有全路径的文本文件名。例如: include <myhead. h> include"C: mypathlahead h 嵌入指令的作用是指示编译器将 file name所指定的文本文 件插入到该指令所在的位置,然后再进行编译。例如: ∥/ MAINPROG. CPP INCFILE. CPP #include incfile cpp #include <iostream. h> void maino void f(void cout < Helloin
4.10.1 嵌入指令 嵌入指令的一般形式为: #include <file_name> 或 #include "file_name" 其中:file_name 是一个可以带有全路径的文本文件名。例如: #include <myhead.h> #include "C:\mypath\ahead.h" 嵌入指令的作用是指示编译器将 file_name 所指定的文本文 件插入到该指令所在的位置,然后再进行编译。例如: // MAINPROG.CPP // INCFILE.CPP #include "incfile.cpp" #include <iostream.h> void main() void f(void) { { f(); cout << "Hello\n"; } }
则经编译器预处理后,文件 MAINPROG. CPP将变成如下的 形式 ∥/ MAINPROG. CPP ∥/这里是 NCFILE CPP中的内容 ∥这里是 iostream. h中的内容 void f(void) cout < Hello void main(
则经编译器预处理后,文件 MAINPROG.CPP 将变成如下的 形式: // MAINPROG.CPP // 这里是 INCFILE.CPP 中的内容 // 这里是 iostream.h 中的内容 void f(void) { cout << "Hello\n"; } void main() { f(); }
4.10.2宏 4.10.2.1无参宏定义 define macro mame text 其中: macro name是一个标识符,它是程序员为宏所取的 名字;可选的text是一段文本,叫做替换正文,它就是程序 员为宏所作的具体定义。例如 define ONE 1 #define TWO 2 将使编译器把源程序中所有的ONE都解释成1:所有的 TWO解释成2
4.10.2 宏 4.10.2.1 无参宏定义 #define macro_mame <text> 其中:macro_name 是一个标识符,它是程序员为宏所取的 名字;可选的 text 是一段文本,叫做替换正文,它就是程序 员为宏所作的具体定义。例如: #define ONE 1 #define TWO 2 将使编译器把源程序中所有的 ONE 都解释成 1;所有的 TWO 解释成 2
几点说明: 1.宏定义必须以“注意:由于编译器在宏替换时是逐级进行 均属于宏定义 的,所以在定义宏时要防止出现二义性。 例如,若将宏 THREE定义成: define TRUE define THREE ONE TWO 将使得编译器把宏则赋值语句: 2.宏定义的替换正 i= THREE* 3: # efine_MYHE将使i的值为7,而不是预期的9。 这里,将标识符N编译器对该语句的解释过程为: 编译预处理指令进 i=1+2*3 3.替换正文可以是 i=1+6 #define UL 7 4.一个已存在的宏可以用作另一个宏定义的替换正文: define THREE (ONE TWO)
几点说明: 1. 宏定义必须以“回车”结束,“回车”符前边所有的字符 均属于宏定义: #define TRUE 1; 将使得编译器把宏 TRUE 解释成 1;。 2. 宏定义的替换正文可以为空: #define _MYHEAD_H_ 这里,将标识符 _MYHEAD_H_ 作为一个标志,以便于条件 编译预处理指令进行测试。 3. 替换正文可以是 C++ 语言的关键字: #define UL unsigned long int 4. 一个已存在的宏可以用作另一个宏定义的替换正文: #define THREE (ONE + TWO) 注意:由于编译器在宏替换时是逐级进行 的,所以在定义宏时要防止出现二义性。 例如,若将宏 THREE定义成: #define THREE ONE + TWO 则赋值语句: i = THREE * 3; 将使 i 的值为 7,而不是预期的 9。 编译器对该语句的解释过程为: i = ONE + TWO * 3; i = 1 + 2 * 3; i = 1 + 6; i = 7;