今天也碰到这个问题,使用#ifdef xxx 想选择编译一段代码,最后发现#ifdef 并不判断条件真假,只看是否前面有define,下面转自

http://blog.csdn.net/zhangchiytu/article/details/7563329

参加华为的面试,竟然才发现#if 和#ifdef是有区别的,绝得无地自容。赶紧整理一下

先看个例子:

#define TARGET_LITTLE_ENDINA 1
#define TARGET_BIG_ENDINA   0

#ifdef TARGET_LITTLE_ENDINA
call little endina function
#else
call big endina function
#endif
不管把TARGET_LITTLE_ENDINA和TARGET_BIG_ENDINA定义成0或者1,甚至后面不写这个0或者1 ,调用的都是little endina函数,这段代码是有问题的,就是没有理解#if和#ifdef之间的区别。

#if的使用说明

#if的后面接的是表达式,如果表达式为1,则编译#if下面的代码

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

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

#ifdef的使用

#if后面接的是一个宏

#ifdef (x)...code...
#endif

这个#ifdef 它不管里面的“x”的逻辑是“真”还是“假”,它只管这个程序前面的宏定义里面有没有定义“x”这个宏(即在这里#define  x 1和#define  x 0等效,都等同于#define x),如果定义了x这个宏,那么编译器会编译中间的…code…否则直接忽视中间的…code…代码。

#if defined的使用

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

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

明白了之间的区别问题就变得非常的容易,修改上述代码只要把其中的#ifdef改成#if就可以达到目的。

#if 和#ifdef的区别相关推荐

  1. c语言 mk文件详解,Android.mk/makefile 的ifeq和ifdef的区别

    使用条件判断 ------ 使用条件判断,可以让make根据运行时的不同情况选择不同的执行分支.条件表达式可以是比较变量的值,或是比较变量和常量的值. 一.示例 下面的例子, 判断$(CC)变量是否& ...

  2. 【C语言】【预处理】#if、#ifdef、#ifeq的区别及应用

    #if和#ifdef的区别与联系 比较容易混淆的是#if和#ifdef,可参考下微软网站的解释: You can use the #ifdef and #ifndef directives anywh ...

  3. 工程中常用的几种宏判断

    注: #if和#ifdef的区别: #if 后面接的是宏. #ifdef 是判断有没有定义这个宏. 1.如果是Debug状态 #if DEBUG#else#endif 2.如果不是在模拟器上运行 #i ...

  4. Android系统构建

    安卓dialog命令: 参考:Android系统Dialog命令分析-充电_cotex_Han的专栏-CSDN博客_diag指令 SIM LOCK(SIM UNLOCK)锁卡功能: 博客:https: ...

  5. linux c 宏判断多条件 #ifdef 和 #if defined 的区别

    多个条件判断用 #if defined 单个条件判断用 #ifdef #ifdef 和 #if defined 的区别在于,后者可以组成复杂的预编译条件,比如 #if defined (AAA) &a ...

  6. C/C++#if #ifdef #ifndef的区别

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

  7. 【C基础】#if、if、#ifdef、#if defined之间的区别

    #if vs. if 条件编译是C语言中预处理部分的内容,它是编译器编译代码时最先处理的部分, 条件编译里面有判断语句,比如 #if .#else .#elif 及 #endif 它的意思是如果宏条件 ...

  8. C/C++之#ifdef、#if、#if defined的区别

    1.看代码 2.运行结果 3.分析 #fi:后面接的表达式,如果为1就编译包含里面的内容 #ifdef:后面接的是一个宏,只要定义这个宏就行 #if defined(x):和#ifdef效果一样 #i ...

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

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

最新文章

  1. PHP:第一章——PHP中的魔术常量
  2. 水稻微生物组时间序列分析4-随机森林回归
  3. __builtin__与__builtins__的区别与关系
  4. 【性能优化】 之 几种常见的等待事件的演示示例
  5. sudo apt-get install libstdc++6
  6. 2043. 简易银行系统
  7. Redis的数据结构之字符串
  8. 使用Matlab(R2018b)画复杂函数的图形(网格图meshgrid)及等高线contour
  9. sql 系统 存储过程的使用方法 转载
  10. 实验server2003的域环境里安装一台Server2008 DC
  11. Laravel响应宏原理
  12. 这款机器人也想体验双十一!
  13. 《线性代数及其应用》看完
  14. access链接 mysql数据库教程_JDBC连接ACCESS数据库的三种方法
  15. 2021年危险化学品经营单位安全管理人员新版试题及危险化学品经营单位安全管理人员模拟考试系统
  16. PL3376C-ASEMI电源管理芯片PL3376C
  17. PassMark 更新排行,苹果 M1 杀疯了
  18. 重仓金融股却遭“滑铁卢”
  19. 揭秘京东文件系统JFS的前世今生,支持双11每秒约10万个对象同时读写
  20. AndroidStudio快捷键汇总

热门文章

  1. 借助Docker单机秒开数十万TCP连接
  2. [Android] 开发第六天
  3. [原]ubuntu14.04 网卡逻辑修改没有文件/etc/udev/rules.d/70-persistent-net.rules
  4. iOS:app直播---采集篇
  5. Google Map API V3开发(5)
  6. MapReduce自定义二次排序流程
  7. CentOS6.5菜鸟之旅:安装VirtualBox4.3
  8. android学习---LinearLayout
  9. 统一建模语言UML轻松入门系列
  10. C语言编程课后训练,C语言编程课后训练20道题.doc