ifndef是 if not define 的缩写,一种宏定义。它是预处理功能中三种(宏定义,文件包含和条件编译)中的第三种--条件编译。

其使用方式是:

#define X

...

#endif

//c语言在对程序进行编译时,会先根据预处理命令进行预处理,C语言编译系统包括预处理,编译和链接等部分。

#ifndef X  //先测试是否被宏定义过

#define X

程序段1//如果X没有被宏定义过,定义X,并编译程序段1;

#else

程序段2 //如果X已经定义过了则编译程序段2 的语句,忽视程序段1.

#endif

条件指示符#ifndef的最主要目的是防止头文件的重复包含和编译。

语句1 #ifndef 标识1

语句2 #define 标识1

语句3 #endif

语句4 ……

语句5 ……

该段代码意思是:如果标识1没有被定义,则重定义标识1,即执行语句2、语句3;如果标识1已经被定义,则直接跳过语句2、语句3,直接执行语句4、语句5、……

ifndef和endif要一起使用,不能存在丢失。

假如你有一个C源文件,它包含了多个头文件,比如头文件A和头文件B,头文件B又包含了头文件A,则最终该源文件包含了两次头文件A。如果你在头文件A里定义了结构体或者类类型(这是最常见的情况),那么问题来了,编译时会报大量的重复定义错误。[1]

例如要编写头文件a.h

在头文件开头写上两行:

#ifndef _A_H

#define _A_H//一般是文件名的大写

头文件结尾写上一行:

#endif

这样一个工程文件里同时包含两个test.h时,就不会出现重定义的错误了。

当第一次包含test.h时,由于没有定义_TEST_H,条件为真,这样就会包含(执行)#ifndef _TEST_H和

#endif之间的代码,当第二次包含test.h时前面一次已经定义了_TEST_H,条件为假,#ifndef _TEST_H和

#endif之间的代码也就不会再次被包含,这样就避免了重定义了.

这样我们把头文件的内容都放在#ifndef和#endif中。不管你的头文件会不会被多个文件引用,你最好是都加上这个。

ifndef 的使用方法相关推荐

  1. Qt源码分析之信号和槽机制

    Qt的信号和槽机制是Qt的一大特点,实际上这是和MFC中的消息映射机制相似的东西,要完成的事情也差不多,就是发送一个消息然后让其它窗口响应,当然,这里的消息是广义的 说法,简单点说就是如何在一个类的一 ...

  2. iOS---学习研究大牛Git高星项目YYCategories(二)

    转载请注明出处. 本文是接着上一篇博客iOS---学习研究大牛Git高星项目YYCategories(一) 三.YYCategoriesMacro.h 一个宏定义类,我会把这一块的功能说一下. tip ...

  3. 神经网络量化之 Ristretto、增量量化INQ、IAO代码实战分析

    神经网络量化之 Ristretto.增量量化INQ.IAO代码实战分析 博文末尾支持二维码赞赏哦 _ 1. Ristretto 固定点浮点数量化 详细介绍 量化逼近方案 Ristretto允许以三种不 ...

  4. 在 Oracle Enterprise Linux 和 iSCSI 上构建您自己的 Oracle RAC 11g 集群

    作者:Jeffrey Hunter 了解如何以低于 2,700 美元的费用在 Oracle Enterprise Linux 上安装并配置 Oracle RAC 11g 第 2 版开发集群. 本指南中 ...

  5. Java面试题大全2021版

    一.Java 基础 JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境. JRE:Java Run ...

  6. C++ 笔记(32)— 预处理、文件包含include、宏替换define、条件包含ifndef、define

    C/C++预处理器在源代码编译之前对其进行一些文本性质的操作. 它的主要任务包括删除注释 . 插入 #include 指令包含的文件的内容 . 定义和替换由 #defme 指令定义的符号以及确定代码的 ...

  7. eclipse java调用c 代码吗_linux下通过eclipse开发用java调用c程序的方法

    linux下通过eclipse开发用java调用c程序的方法: 1.先建立好java工程并建立java文件如下: public class testso {     static {         ...

  8. Linux下HOOK动态链接库中API的方法

    2012年,我写了一篇介绍Windows系统下Ring3层API的hook方案--<一种注册表沙箱的思路.实现--Hook Nt函数>,其在底层使用了微软的Detours库.5年后,我又遇 ...

  9. Linux下获取usb视频设备vendor id和product id的8种方法

    在使用usb摄像头获取视频时,有时需要获取此摄像头供应商ID(vendor id, vid)和产品ID(product id, pid),这里在Linux下提供获取vid和pid的8种方法: 1. 通 ...

最新文章

  1. 阿里面试:索引失效的场景有哪些?索引何时会失效?
  2. 轻松实现远程批量拷贝文件脚本(女学生作品)
  3. P1207 双重回文数
  4. Python SqlAlchemy使用方法
  5. OJ1068: 二进制数(C语言)
  6. 功能增强的进度条控件(源码)
  7. Linux下java进程CPU占用率高分析方法
  8. ZOJ4037 Peer Review
  9. 竞价推广的流程有哪些?
  10. Dell 服务器阵列扩容【经验分享(转)】
  11. linux 使用c语言如何获取网关地址
  12. 100天精通Andriod逆向——第2天:Android基础知识和jadx的使用
  13. 科普博客:摩尔定律和安迪-比尔定律
  14. min_max算法和alpha-beta剪枝 python实现
  15. 上海富爸爸_放弃高薪选择财务自由之路(转)
  16. Java 垃圾收集器
  17. Bose SoundLink Revolve或者Bose SoundLink Revolve+ AUX音频播放一会没有声音
  18. 计算机毕业设计(75)php小程序毕设作品之网上销售小程序商城系统
  19. [渝粤教育] 深圳信息职业技术学院 《新理念英语》English For You 参考 资料
  20. oracle数据库impdp命令的使用方法

热门文章

  1. Caffe的python接口安装
  2. pushlet java_Pushlet实现后台信息推送(一)
  3. 图片转化为向量Tensor的方法
  4. 【笔记】【机器学习基础】交叉验证
  5. vue项目全局把px转换成rem
  6. 超简单C#获取带汉字的字符串真实长度(单个英文长度为1,单个中文长度为2)
  7. 数据中心建筑绿色评价系统简介
  8. 拳霸 中最精彩的泰拳 一挑多人打斗. 视频
  9. 计算机辅助设计capp设计,[高等教育]09第四章 计算机辅助设计与制造技术CAPP.ppt...
  10. STM32实战 1 | STM32Cube生态系统认识与介绍