首页 > 代码库 > c++ 预处理和多重替换

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))

 

c++ 预处理和多重替换