#if vs. if

条件编译是C语言中预处理部分的内容,它是编译器编译代码时最先处理的部分,

条件编译里面有判断语句,比如 #if 、#else 、#elif 及 #endif

它的意思是如果宏条件符合,编译器就编译这段代码,否则,编译器就忽略这段代码而不编译,如

#define  A 0  //把A定义为0#if (A > 1)printf("A > 1");  //编译器没有编译该语句,该语句不生成汇编代码#elif (A == 1)printf("A == 1"); //编译器没有编译该语句,该语句不生成汇编代码#elseprintf("A < 1");   //编译器编译了这段代码,且生成了汇编代码,执行该语句#endif

而 if 语句则不然,if 是 C 语言中的关键字,它根据表达式的计算结果来觉定执行那个语句,它里面的每个分支都编译了的, 如

#define A 0if (A > 1)printf("A > 1");   //编译器编译该语句,但因为A == 0 未执行else if(A == 1)printf("A == 1");  //编译器编译该语句,但因为A == 0 未执行elseprintf("A < 1");  //编译器编译该语句,因为A == 0 故执行

作为一个编译“开关”,比如:

#if(条件满足)
执行代码1
#else
执行代码2
#endif

假如编译时,确实满足条件,则生成的程序文件(.exe文件)中不会有执行代码2的。如果用普通if语句,生成的程序文件就会有执行代码2,这个区别看看生成文件大小就可以知道。如果你的条件在程序编译前就已经确定了,那就用#if;如果条件需要在程序运行过程中才能判断,则用if。

所以 简单地讲,条件编译是根据 宏条件 选择性地编译语句,它是编译器在编译代码时完成的;

条件语句是根据条件表达式选择性地执行语句,它是在程序运行时进行的。

#if的使用说明

#if的后面接的是表达式

#if (MAX==10)||(MAX==20)code...
#endif

它的作用是:如果(MAX10)||(MAX20)成立,那么编译器就会把其中的#if 与 #endif之间的代码编译进去(注意:是编译进去,不是执行!!)

#if defined的使用

#if后面接的是一个宏。

#if defined (x)...code...
#endif

这个#if defined它不管里面的“x”的逻辑是“真”还是“假”它只管这个程序的前面的宏定义里面有没有定义“x”这个宏,如果定义了x这个宏,那么,编译器会编译中间的…code…,否则会直接忽视中间的…code…代码。

另外 #if defined(x)也可以取反,也就用 #if !defined(x)

#ifdef的使用

#ifdef的使用和#if defined()的用法一致
#ifndef又和#if !defined()的用法一致。

最后强调两点:
第一:这几个宏定义只是决定代码块是否被编译!
第二:别忘了#endif

【C基础】#if、if、#ifdef、#if defined之间的区别相关推荐

  1. #if、#ifdef、#if defined之间的区别【转】

    转自:http://quanminchaoren.iteye.com/blog/1870977 #if的使用说明 #if的后面接的是表达式 #if (MAX==10)||(MAX==20)code.. ...

  2. #if、#ifdef、#if defined之间的区别

    http://www.yucoat.com/c_program/difference_if_ifdef_if_defined.html #if的使用说明 #if的后面接的是表达式 #if (MAX== ...

  3. [转]ExtJs基础--Html DOM、Ext Element及Component三者之间的区别

    要学习及应用好Ext框架,必须需要理解Html DOM.Ext Element及Component三者之间的区别. 每一个HTML页面都有一个层次分明的DOM树模型,浏览器中的所有内容都有相应的DOM ...

  4. 集中和分散架构之间的区别_分散式应用程序架构:后端,安全性和设计模式

    集中和分散架构之间的区别 Decentralized applications, or ÐApps, require a special system design to achieve high s ...

  5. 我应该如何解释接口和抽象类之间的区别?

    本文翻译自:How should I have explained the difference between an Interface and an Abstract class? In one ...

  6. MEAN.js和MEAN.io之间的区别

    本文翻译自:Difference between MEAN.js and MEAN.io I wanted to use the MEAN JavaScript Stack, but I notice ...

  7. java se 与j2se_关于java:J2EE和J2SE项目之间的区别

    本问题已经有最佳答案,请猛点这里访问. 我已经从github下载了一个开源项目. 这是一个基于Maven的项目. 我如何理解该项目是J2SE项目还是J2EE项目? 这两种项目在结构上有何不同? Jav ...

  8. Pandas中map,applymap和apply方法之间的区别

    本文翻译自:Difference between map, applymap and apply methods in Pandas Can you tell me when to use these ...

  9. 定义指令时“控制器”,“链接”和“编译”函数之间的区别

    本文翻译自:Difference between the 'controller', 'link' and 'compile' functions when defining a directive ...

最新文章

  1. Linux 命令小汇总
  2. 用户空间与内核空间数据交换的方式(zz)
  3. 【 Notes 】WLLS Algorithm of TOA - Based Positioning (include the two - step WLS estimator)
  4. TVS二极管,双向封装,如何选型?
  5. Linux Shell编程之一循环结构
  6. android odex版本调试_Android可执行文件之谜 - DEX与ODEX, OAT与ELF
  7. gdb可以查询执行文件的宏, 但是查询不了o文件的宏
  8. JVM菜鸟进阶高手之路
  9. 50种不同编程语言的“Hello, World”,你会写几种?
  10. MongoDB学习day08--Mongoose索引、Mongoose内置方法、扩展Mongoose Model的静态方法和实例方法...
  11. java中使用switch case报错case expressions must be constant expressions
  12. 【论文解读】“推荐系统”加上“图神经网络”
  13. 面试常被问的65个问题及回答技巧(请收藏)
  14. 同事乱用 Redis 卡爆,我真是醉了
  15. 神经网络与机器学习导言笔记——反馈
  16. ROC曲线的绘制过程/AUC/TPR、FPR、敏感度和特异度
  17. Metricbeat监听容器CPU利用率,内存等使用情况,发送给ElasticSearch并展示在kibana
  18. druid Hadoop-based Batch Ingestion
  19. 定时器工作方式0初值除32_理解定时器/计数器的特殊功能寄存器Ⅱ--TCON
  20. VM设置Ubuntu窗口自适应大小

热门文章

  1. echarts的应用
  2. 【Argoverse 1 Motion Forecasting Dataset】轨迹预测数据集简介
  3. CSS3选择器-组合选择器
  4. 通过页面验证hadoop是否安装成功的方法
  5. getchar()用法 与 getch()函数使用方法
  6. 织梦dedecms 幻灯片 自定义设置
  7. ecshop首页幻灯片大小设置
  8. java抽奖_JAVA实现用户抽奖功能(附完整代码)
  9. 前端开发实习笔试题(简答题)
  10. vuecli4+vant移动端响应式项目踩坑记录