C/C++中的预处理变量的作用

我们在编写程序时,同时包含一个头文件多次是一件常见的事情,当然同时多次包含一个头文件可能会引起不必要的错误。使得头文件安全的通用做法,是使用预处理器定义头文件保护符。头文件保护符用于避免在已经见到头文件的情况下重新处理该头文件的内容。

 

C++为了避免头文件的多次包含,引入了预处理变量:#define,#ifndef ,#endif。

预处理器变量 的名字在程序中必须是唯一的。任何与预处理器变量相匹配的名字的使用都关联到该预处理器变量。为了避免名字冲突,预处理器变量经常用全大写字母表示。

 

预处理器变量有两种状态:已定义或未定义。定义预处理器变量和检测其状

态所用的预处理器指示不同。

 

#define 指示接受一个名字并定义该名字为预处理器变量。

#ifndef字面意思就是if not define,如果没有定义指示检测指定的预处理器变量是否未定义。如果预处理器变量未定义,那么跟在其后的所有指示都被处理,直到出现 #endif。

 

没有接触过预处理器变量的同学看了上面解释可能不太理解,下面具体一下说明预处理变量用法和意义所在。

 

假设现在有两个头文件xx1.h,和xx2.h。其中xx1.h包含一个类class1的定义;如果在头文件xx2.h中要用到class1这个类,那么我们在xx2.h这个头文件里面则要包含xx1.h这个头文件,即:#include“xx1.h”。

 

在主程序xx.cpp中,开始需要把自定义的头文件xx1.h和xx2.h给加进去,即:#include“xx1.h”

#include“xx2.h”

那么这样xx1.h这个头文件实际上被包含了两次,xx1.h中的类class1也相当于被定义了两次,在编译时会出现错误,那么上面介绍的预处理变量:#define,#ifndef ,#endif可以完美的解决这个问题。

首先我们在xx1.h里加入这样的几句话:

#ifndef  XX1

#define  XX1

//

xx1.h里面原有的代码

//
#endif

 

这样当xx1.h这个头文件被包含多次时,在主程序处理时却只会被处理一次。下面稍作解释:

当主程序遇见头文件#include“xx1.h”时,如果是第一次处理xx1.h头文件,由于预处理器变量XX1还没有被定义,所以会执行#ifndef  XX1这个语句,同时预处理器变量XX1也被定义,头文件xx1.h中的代码也会被执行。

当主程序遇见头文件#include“xx2.h”时,因为xx2.h也包含xx1.h,所以程序还会再次进入到xx1.h这个头文件中执行,这时由于预处理器变量XX1在第一次执行xx1.h这个头文件时已经被定义,所以#ifndef XX1条件判断失败,那么便不会在继续执行后续的代码,即不会在执行xx1.h头文件中编写的代码了。这样便保证了头文件xx1.h在包含多次的情况下只会被处理一次。

转载自@xiaoaihhh, https://blog.csdn.net/u010213393/article/details/40556331

posted @ 2018-04-16 10:06  Mars_2030  阅读(545)  评论(0编辑  收藏  举报