c++的预处理程序指令

来源:互联网 发布:数据库认证 编辑:程序博客网 时间:2024/05/16 07:49

         c++中的预处理功能主要是指可以在c++源程序中包含各种编译指令,用这些编译命令在代码编译前执行,所以这些命令被称为预处理命令,实现c++的预处理功能。

       预处理指令是编译系统的控制命令,编译系统根据其要求先对代码进行优化,然后在进行编译,使程序变得简练清晰。常见的预处理命令有:文件包含命令、条件编译命令和宏定义命令。所有的预处理命令都是以“#”开始的,每一条命令单独占一行。当预处理命令比较长需要分行时,在同一行的最后要加上“\”续行符。预处理命令可以放在程序文件的任何位置。

include命令

       include命令是预处理中的文件包含命令,文件包含的意思讲其他文件内容插入到当前命令位置,只是其在编辑代码时并不出现,只在编译时才插入进来。#include<>是包含那些由系统提供的并存在指定子目录中的头文件,#include“”是包含那些用户自定义的放在当前目录或者其他目录下的头文件和源代码文件。
       头文件是指有函数、常量、结构或者其他复杂类型什么的,以h作为文件扩展名的文件。头文件包含命令一般被放在源文件的头部。在使用头文件包含命令时需要主要:
1.1条文件包含指令只能包含一个文件,若想包含多个文件,应当使用多条文件包含指令。例如
      #include<iostream>
      #include<string.h>
2.在被包含的文件中,还可以使用文件包含指令包含其他文件,即文件包含命令可以嵌套使用。例如myfunc.h文件夹中,包含了其他头文件。
      //myfunc.h
      #include<string.h>
      #include<math.h>
      这样myfunc.h文件中包含了另外两个文件。
3.在定义被包含文件时,其内容不宜过多。如果太多,将会导致被包含文件的内容利用率变低,而且增大了目标文件的大小。

宏定义

宏定义看起来和常量定义const非常类似,单也是有区别的,如下:
1.const定义的是一个有数据类型的常量,而宏定义的是没有数据类型的,可以用其替换程序代码中的任何字符常量
2.const定义的常量是有内存分配,并保存在内存中,而宏定义没有内存分配
3.const定义常量是一个语句,以分号结束,而宏定义是预处理命令,不能用分号结束
在c++中一般不用#define来定义常量,而使用const
使用#define命令时需注意:
1.宏名和字符串之间应该有空格间隙,不要用等号进行连接
2.#define是一个预处理命令。其所定义的标识符等价于后面的字符串,不要再最后加分号,例如
     #define LEN 10;
     这里LEN等价于“10;”,而不是“10”
在程序中,一旦有宏定义,那么其作用域就是从文件中定义的开始到定义的文件结束,在文件范围内有效。如果其作用域不这么大,可以使用undef命令来取消宏定义。例如
     #define N10 
     void main()
      {}   N有效
     #undef N
     void fun()
     {}    N无效
宏函数相当于c++的内联函数,但其没有参数数据类型的匹配检查。而且内联函数的效率更高。
在使用宏函数时需注意:
1.带参数的宏函数的字符串应写在一行上,如果需要多行。每行结束时使用续行符结束,并在该符号后按下回车键
2.在定义宏函数时,函数名和“()”之间不能有空格,否则“()”和右边的全部会被当做字符串,例如
   #define ADD (X+Y) X+Y
这时是将(X+Y) X+Y作为宏替换的字符串处理,而非x+y当做宏替换字符串
3.定义宏函数时,应该为每个参数名加上(),例如
  #define M(X,Y) X*Y

在定义时不加括号,如果其引用的语句如下:

 sum=M(a+10,b+20);

但因没有给参数加括号,所以替换后变为

 sum=a+10*b+20;

条件编译

条件编译命令的作用是用来定义源文件中的某些编译代码在一定的条件下参与编译,如果条件不满足则不编译。常用的条件编译命令的格式有3种:
1.#ifdef-#else-#endif
 #ifdef 标识符
  代码段1
 #else
代码段2
 #endif
意思就是当标识符被定义过则对代码段1进行编译,如果没有被定义则对代码段2编译
2.#ifndef-#else-#endif
3.#if-#else-#endif
 #if 常量表达式1
代码段1
 #elif 常量表达式2
代码段2
……
 #elif 常量表达式n
代码段n
 #else 
代码段n+1
 #endif

头文件的编写

在c++中常常把一个函数、全局变量、全局常量和结构及其他一些数据类型的声明放在头文件中。这样的好处就是可以在程序的任何一个源代码文件中对这些数据进行引用。例如可以把一个结构声明放在头文件中。这样只要是源代码文件中和有需要这个结构的地方,就把声明这个结构的头文件包含进来,就可以使用,而不需要再次声明。
不过由于文件包含指令可以嵌套使用,因此有时可能导致多次包含同一个头文件,最后形成重复声明的问题。例如:
#include“file1.h”
#include“file2.h”
void main()
{……}
其中file1.h文件#include“xiaokun.h"
file2.h中#include“xiaokun.h
如果是这样那么main.cpp中就会导致两次包含一个头文件。为了避免这种情况,只有在头文件中自定义一个唯一的标识符,如果其被定义过,则头文件将不再被包含。具体做法是在“xiaokun.h”中增加如下内容:
#ifndef _XIAOKUN_H_
#define _XIAOKUN_H_
//xiaokun.h中的代码段
#endif
第一次被包含时,没有被定义所以就会被编译,第二次被包含时就不会被编译了。
应该养成给每一个自定义的头文件都增加这样唯一的文件标识符,防止头文件被重复包含!!!!!!!

0 0