c++ 预处理和多重替换
预处理概念 #include #define extern 一、 预处理概念 在源代码编译成机器指令之前,都要进行预处理。 预处理阶段一般会在编译之前处理和修改C源代码。完成预处理后预处理指令就会在源代码中删除,然后才开始编译阶段。 注:预处理操作发生在编译之前。它们会修改程序语句,但不会被编译执行。 二、#include #include<file.h> //表示在默认路径中搜索file.h 并用file.h里的内容替换 #include<file.h> #include"file.h" //表示在当前目录里搜索file.h 并用file.h里的内容替换 #include"file.h" 三、#define #define filenaeme "test.txt" //在预处理时 用"test.txt" 替换所有filename 并且删掉此行 #deinfe pi 3.1415926 //在预处时 用3.1415926 替换所有 pi 并且删掉此行 四、 extern extern可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。(另外,在C++中extern也可用来进行链接指定。) 如在a.c中定义过全局变量 int a要在hello.c中引用全局变量a则要作如下定义: extern int a; 仅仅是一个变量的声明,其并不是在定义变量a,并未为a分配内存空间。变量a在所有模块中作为一种全局变量只能被定义一次,否则会出现连接错误。 如在a.c中定义过全局函数 int add(int a,int b)要在hello.c中引用函数add则要作如下定义: extern int add(int,int); 仅仅是一个变量的声明,其并不是在定义变量a,并未为a分配内存空间。变量a在所有模块中作为一种全局变量只能被定义一次,否则会出现连接错误。
教学内容: 宏替换 看起来像函数的宏 多行上的预处理指令 结合两个宏展开式的结果 容易范错的宏 一、 宏替换 支持参数替换的#define指令,我们一般称为宏指令。它也属于预处理指令。 例: #define print_int(i) printf("%d\n",i) 二、 看起来像函数的宏 #define add(a,b) a+b #define mul(a,b) a*b 三、 多行上的预处理指令 #define add(a,b) \ a+b #define mul(a,b) \ a*b 四、 结合两个宏展开式的结果 int my1=111; int my2=222; #define cat(a,b) a##b printf("%d,%d",cat(my,1),cat(my,2)); 五、容易范错的宏 #define mul(a,b) a*b mul(5,3-2) //按照一般的理解应该是5*(3-2)=1 实际上替换展开后是 5*3-2=13 修改 #define mul(a,b) ((a)*(b))