【C基础】#if、if、#ifdef、#if defined之间的区别
#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之间的区别相关推荐
- #if、#ifdef、#if defined之间的区别【转】
转自:http://quanminchaoren.iteye.com/blog/1870977 #if的使用说明 #if的后面接的是表达式 #if (MAX==10)||(MAX==20)code.. ...
- #if、#ifdef、#if defined之间的区别
http://www.yucoat.com/c_program/difference_if_ifdef_if_defined.html #if的使用说明 #if的后面接的是表达式 #if (MAX== ...
- [转]ExtJs基础--Html DOM、Ext Element及Component三者之间的区别
要学习及应用好Ext框架,必须需要理解Html DOM.Ext Element及Component三者之间的区别. 每一个HTML页面都有一个层次分明的DOM树模型,浏览器中的所有内容都有相应的DOM ...
- 集中和分散架构之间的区别_分散式应用程序架构:后端,安全性和设计模式
集中和分散架构之间的区别 Decentralized applications, or ÐApps, require a special system design to achieve high s ...
- 我应该如何解释接口和抽象类之间的区别?
本文翻译自:How should I have explained the difference between an Interface and an Abstract class? In one ...
- MEAN.js和MEAN.io之间的区别
本文翻译自:Difference between MEAN.js and MEAN.io I wanted to use the MEAN JavaScript Stack, but I notice ...
- java se 与j2se_关于java:J2EE和J2SE项目之间的区别
本问题已经有最佳答案,请猛点这里访问. 我已经从github下载了一个开源项目. 这是一个基于Maven的项目. 我如何理解该项目是J2SE项目还是J2EE项目? 这两种项目在结构上有何不同? Jav ...
- Pandas中map,applymap和apply方法之间的区别
本文翻译自:Difference between map, applymap and apply methods in Pandas Can you tell me when to use these ...
- 定义指令时“控制器”,“链接”和“编译”函数之间的区别
本文翻译自:Difference between the 'controller', 'link' and 'compile' functions when defining a directive ...
最新文章
- Linux 命令小汇总
- 用户空间与内核空间数据交换的方式(zz)
- 【 Notes 】WLLS Algorithm of TOA - Based Positioning (include the two - step WLS estimator)
- TVS二极管,双向封装,如何选型?
- Linux Shell编程之一循环结构
- android odex版本调试_Android可执行文件之谜 - DEX与ODEX, OAT与ELF
- gdb可以查询执行文件的宏, 但是查询不了o文件的宏
- JVM菜鸟进阶高手之路
- 50种不同编程语言的“Hello, World”,你会写几种?
- MongoDB学习day08--Mongoose索引、Mongoose内置方法、扩展Mongoose Model的静态方法和实例方法...
- java中使用switch case报错case expressions must be constant expressions
- 【论文解读】“推荐系统”加上“图神经网络”
- 面试常被问的65个问题及回答技巧(请收藏)
- 同事乱用 Redis 卡爆,我真是醉了
- 神经网络与机器学习导言笔记——反馈
- ROC曲线的绘制过程/AUC/TPR、FPR、敏感度和特异度
- Metricbeat监听容器CPU利用率,内存等使用情况,发送给ElasticSearch并展示在kibana
- druid Hadoop-based Batch Ingestion
- 定时器工作方式0初值除32_理解定时器/计数器的特殊功能寄存器Ⅱ--TCON
- VM设置Ubuntu窗口自适应大小