C++学习笔记(六):关于ifdef 和ifndef的使用

       在写程序的时候经常看到这么几句话:

       #ifndef  xxx_xxx_x

       #define  xxx_xxx_x

       ....

       #endif

      自己也一直知道这个是防止头文件重复编译的保护语句,因此自己写程序的时候只要自己写头文件,那不管三七二十一通通把这几句加上,但是其实自己一直不知道为什么加这几句可以达到防止头文件重复编译的功能。今天重新看书,才明白原理。现在本人献丑,稍稍介绍一下。(这个头文件保护功能在C和C++中是一样的,而且用法也一样)

      C++中确保头文件多次包含仍旧能够安全工作的常用技术是预处理器(preprocessor),这也是从C语言中继承过来的。在我们用C语言开发单片机、嵌入式等软件时,也经常可以看到这几句话。

      C++中头文件保护的方法是依赖于预处理变量的。

      预处理变量是由#define指令定义的,比如 #define  GET_INFOR_H,则GET_INFOR_H就被称为预处理变量。(注意区分预处理变量与宏定义)

      预处理变量只有两种状态,已经定义和还未定义。

      #define的作用是将一个名字设定成预处理变量,而#ifndef 和 #ifdef是用来判断预处理变量是否被定义的。就好像if语句一般。对于#ifndef,当且仅当变量未被定义为真,而#ifdef则相反,当且仅当变量已经被定义时为真。而语句检查结果为真,则执行后面的操作,直到遇到#endif结束。举例解释如下,在文件get_infor.h中有如下语句:

      #ifndef  GET_INFOR_H

      #define  GET_INFOR_H

      #include <iostream>

      ........

      ........

      #endif

      当第一次包含文件get_infor.h时,GET_INFOR_H还未被定义成预处理变量,故#ifndef检查为真,于是预处理器依次处理#ifndef  GET_INFOR_H后面的语句,则会执行#define  GET_INFOR_H,此时GET_INFOR_H会被定义成预处理变量。故当此文件再次被编译时,#ifndef检查结果变为假,那么此文件将不会再次被编译。

      在这整个程序中预处理变量必须是唯一的。虽然其写法可以有很多中,也没有必须的要求,但是考虑到确保预处理变量的唯一性和程序的可读性,通常会基于头文件的名字来定义相应的预处理变量。例如上面的头文件名字为get_infor.h,那么预处理变量则定义为GET_INFOR_H。全部大写也能够较好的确保其唯一性,避免冲突。

      另外加一句,头文件即使目前还没有被包含在任何的其他文件中,也应该设置一下头文件保护。头文件保护的做法很简单,也不会增加程序的复杂度。因此,最好养成随手加头文件保护的好习惯,不要一味的纠结于这个程序到底需不需要。

      巧用#ifndef不仅可以用于头文件保护还可以用来调试程序,或者写程序的时候如果对于某个语句是否执行需要加限制条件,都可以这种方法。因为 #ifdef 和#endif中间的语句是否执行完全取决于你是否加上#define。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值