大部分情况下,C/C++源程序中所有的行都参加编译。但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。有时,希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。 特别是在实际工程文件中,使用这种条件编译的情况就是家常便饭。

条件编译命令最常见的形式为:

#ifdef 标识符
程序段1
#else
程序段2
#endif

它的作用是:当标识符已经被定义过(一般是用#define命令定义),则对程序段1进行编译,否则编译程序段2。 
其中#else部分也可以没有,即:

#ifdef
程序段1
#denif

在头文件中使用#ifdef和#ifndef是非常重要的,可以防止双重定义的错误。如你在头文件aaa.h中定义了一个类aaa如下:

  class   aaa   {   .......};   

如果两次#include   "aaa.h"(不见得是直接,也有可能两个不同的头文件中都包含了这个头文件)就会出错,因为相同的类不能定义两次。把aaa.h稍做修改:

  #ifndef   _aaa_   #define   _aaa_   class   aaa   {   ...........};   #endif   

就可以避免这样的问题。因为当你已经包含过这个文件,_aaa_就会有了定义,那么#ifndef的条件为假,就不会再执行后面的类定义了。

#ifdef和#endif必须成对使用。   
  从理论上讲可以出现在任何地方(头文件和实现文件中)   
  通常为了防止头文件被多次包含,在头文件中使用是必须的:   
  如:#ifndef   MY_HEAD_H   //头文件开头,名字是任意的,注意不要和其它头文件冲突

有时候,在b.h中会include   "a.h"  ,在"c.h"中会include   "b.h"及include"a.h", 这时,如果不用ifndef/endif,就会包含两次a.h,产生错误。 

小结:

把头文件的内容都放在#ifndef和#endif中吧。不管你的头文件会不会被多个文件引用,你都要加上这个。一般格式是这样的:

#ifndef <标识>
#define <标识>......
...... #endif

<标识>在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线,如:stdio.h 

#ifndef _STDIO_H_ 
#define _STDIO_H_

......

#endif

#ifdef与#endif用法小结相关推荐

  1. c++ 预处理命令 #if, #ifdef, #ifndef, #else, #elif, #endif用法

    #if, #ifdef, #ifndef, #else, #elif, #endif用法 #if, #ifdef, #ifndef, #else, #elif, #endif #if, #ifdef, ...

  2. #ifdef,#else,#endif,#if用法详解(转)

    #ifdef,#else,#endif,#if用法详解(转) 2011-04-22 10:11 预处理就是在进行编译的第一遍词法扫描和语法分析之前所作的工作.说白了,就是对源文件进行编译前,先对预处理 ...

  3. #ifdef #else #endif #fi #ifndef 的用法

    预处理就是在进行编译的第一遍词法扫描和语法分析之前所作的工作.说白了,就是对源文件进行编译前,先对预处理部分进行处理,然后对处理后的代码进行编译.这样做的好处是,经过处理后的代码,将会变的很精短.   ...

  4. #ifdef #else #endif 的用法

    预处理就是在进行编译的第一遍词法扫描和语法分析之前所作的工作.说白了,就是对源文件进行编译前,先对预处理部分进行处理,然后对处理后的代码进行编译.这样做的好处是,经过处理后的代码,将会变的很精短. 关 ...

  5. #ifdef与#endif的作用及用法

    一般情况下,源程序中所有的行都参加编译.但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是"条件编译".有时,希望当满足某条件时对一组 ...

  6. C++中 #ifdef 和#endif的用法与作用详解

    一般情况下,源程序中所有的行都参加编译.但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是"条件编译".有时,希望当满足某条件时对一组 ...

  7. extern 用法小结

    1 基本解释 extern可以置于变量或者函数 前,以标示变量或者函数 的定义在别的文件中,提示编译器遇到此变量和函数 时在其他模块中寻找其定义. 另外,extern也可用来进行链接指定. 2 问题: ...

  8. TinyXML用法小结

    TinyXML用法小结 1.      介绍 Tinyxml的官方网址:http://www.grinninglizard.com 官方介绍文档:http://www.grinninglizard.c ...

  9. 【C语言】#ifdef和#endif条件编译

    条件编译 条件编译 条件编译的格式 常见形式 defined运算符 #if的使用 #if defined的使用 #if和#elif命令 #ifdef和#ifndef命令 #if #endif的用法 # ...

最新文章

  1. abaqus失效单元删除_[转载]abaqus单元删除的一般方法
  2. SSH小区停车管理系统答辩PPT免费下载
  3. 腾讯管家中的壁纸无下载按钮,如何保存?
  4. jenkins插件镜像源
  5. 如何清除项目 git 版本控制信息
  6. Ubuntu 18.04截屏
  7. excel提取单元格内特定字符(字/词)前(后)的内容
  8. 周金瑞11.17黄金还会涨?黄金原油价格分析及白银操作建议
  9. TensorFlow RNN MNIST字符识别Demo快速了解TF RNN核心框架
  10. 服务器运维技术-02 Linux基本使用
  11. 惠普暗影精灵3代type-c接拓展坞无反应的处理方法
  12. 文件夹加密超级大师 v13.10 是什么
  13. Choco-slover的使用
  14. VS2022 MAUI Hello World——Windows平台及Android平台效果
  15. aizuda 学习之 @ControllerAdvice 和RequestBodyAdviceAdapter运用 自动配置介绍
  16. 屏蔽百度及其广告的部分Host
  17. java 中文转拼音之pinyin4j
  18. 计算机c语言期末答案,计算机C语言期末考试复习试题及答案[1]
  19. java实现coap协议源码_原 分布式项目(三)CoAp
  20. (附源码)计算机毕业设计ssm大学生心理咨询系统

热门文章

  1. 摩尔庄园不同服务器账号互通吗,摩尔庄园手游服务器互通吗 服务器互通攻略...
  2. 如何跟踪员工考勤时间和出勤率
  3. 如何通过git拉取gitlab上面的项目(小菜鸟入门小白教程)
  4. Linux——FTP服务器搭建及访问
  5. 计算机网络与综合布线系统设计,计算机网络综合布线系统设计探究
  6. yolov5 detect报错
  7. matlab 周品,周品. MATLAB神经网络设计与应用[M]. 北京: 清华大学出版社, 2013.
  8. C# 委托与事件详解(二)
  9. Flink 容错性机制- barrier(屏障)
  10. Command line is too long. Shorten command line for XXXApplication or also for Spring Boot default