使用#if(条件1)  #else 条件编译的时候,当#if(条件1)中的条件对比内容是枚举成员的时候会出现无论什么情况,#if后边的条件都是的情况。这可能是由于#if条件起作用是在预编译阶段起作用,而预编译阶段时候枚举变量是占用同一块内存,导致预编译的判断#if条件不同枚举的成员的值相等,所以#if条件恒成立,最终永远进入不到#else分支下。下面举了两个例子,分别说明错误原因,及修改建议。

#include <stdio.h>
typedef enum condition
{
   CONDITION_A,
   CONDITION_B 
}condition_t;

#define MyCondition CONDITION_A  

#if (MyCondition == CONDITION_B)
    #define MAX 100
#else
    #define MAX 200   //这个#else条件没有起作用,main中打印显示MAX值是100
#endif

int main()
{
    printf("MAX is %d \n", MAX); //100
    printf("MyCondition is %d \n", MyCondition); //0
    printf("CONDITION_A is %d \n", CONDITION_A); //0
    printf("CONDITION_B is %d \n", CONDITION_B); //1
    return 0;
}

针对此情况,我们避免在预编译阶段使用枚举,改用宏定义。

#include <stdio.h>

#define   CONDITION_A 0  //使用宏而不是枚举
#define   CONDITION_B 1  //使用宏而不是枚举

#define MyCondition CONDITION_A

#if (MyCondition == CONDITION_B)
    #define MAX 100
#else
    #define MAX 200   //这个#else条件起作用,main中打印显示MAX值是200
#endif

int main()
{
    printf("MAX is %d \n", MAX); //200
    printf("MyCondition is %d \n", MyCondition); //0
    printf("CONDITION_A is %d \n", CONDITION_A); //0
    printf("CONDITION_B is %d \n", CONDITION_B); //1
    return 0;
}

在#if #else条件编译时候用枚举变量做条件对比易出错,建议#if #else条件编译结合宏#define使用相关推荐

  1. 光遇服务器维护都在干什么,光遇:全图毕业后该做什么?老玩家建议,这四件事不做会后悔...

    原标题:光遇:全图毕业后该做什么?老玩家建议,这四件事不做会后悔 光遇:全图毕业后该做什么?老玩家建议,这四件事不做会后悔 前言: 大家好,我是喜欢玩游戏.聊游戏的孟婆小叔.游戏里的毕业,即六大地图的 ...

  2. myBatis的xml映射文件中传入list集合与数组做条件

    mybatis的xml映射文件中传入list集合与数组做条件 1.传list集合参数 1.1sql映射: <select id="queryDeptListByBankLevelAnd ...

  3. 判断参数大于0_能做条件判断的文本函数

    我们知道文本函数的一般作用就是查找.替换.提取文本等等,可是能做条件判断的文本函数你见过吗?不仅如此,它还可以让日期变数字.数字变大写.金额变万元等等.说到这里,屏幕前的小伙伴有猜到它是谁吗? 在Ex ...

  4. ftl if else判断_为什么都不用 switch 而使用 if/ else 来做条件判断?

    Java技术栈 www.javastack.cn 关注优质文章 请用5秒钟的时间查看下面的代码是否存在bug. 推荐阅读:switch case 支持的数据类型. OK,熟练的程序猿应该已经发现Bug ...

  5. Java是先难后易吗_做题先易后难,干活先难后易

    1 事儿难长智慧, 事儿易生愚昧. 2 诞生容易,做好人难: 说话容易,把话说好难: 走平道容易,上天入地都难: 吃饭容易,种地掙钱都难: 学过的容易,没学的都难: 事做起来容易,不做都难: 吃胖容易 ...

  6. ibm linux mq 发送消息_RabbitMq、ActiveMq、Kafka和Redis做Mq对比

    一.RabbitMq RabbitMQ是一个Advanced Message Queuing Protocol(AMQP)的开源实现,由以高性能.可伸缩性出名的Erlang写成.RabbitMQ Se ...

  7. 【AI初识境】给深度学习新手做项目的10个建议

    这是专栏<AI初识境>的第12篇文章.所谓初识,就是对相关技术有基本了解,掌握了基本的使用方法. 在成为合格的深度学习算法工程师,尤其是工业界能够实战的调参选手之前,总会踏足很多的坑. 今 ...

  8. THYMELEAF 如何用TH:IF做条件判断

    TestController 增加一个布尔值数据,并且放在model中便于视图上获取 package com.how2java.springboot.web; import java.util.Arr ...

  9. jquer each 遍历的结果不显示 null_SpringBoot系列(三十一)- Thymeleaf如何用th:each 做条件遍历

    步骤1:基于前面的知识点步骤2:先运行,看到效果,再学习步骤3:模仿和排错步骤4:TestController步骤5:普通遍历步骤6:带状态的遍历步骤7:结合 select步骤8:结合 单选框步骤9: ...

最新文章

  1. 搜索目录下 匹配文件中 最新的文件 路径
  2. 手把手带你使用JS-SDK自定义微信分享效果
  3. python中__init__.py的作用、module和package
  4. stylus之方法(Functions)
  5. Windows核心编程(笔记13) 第十六章--第二十六章
  6. SciPy 非线性方程求解 | Python技能树征题
  7. 《冰河的渗透实战笔记》电子书,442页,37万字,正式发布!!
  8. QT5.11下载与安装教程
  9. 数据清洗案例 OpenRefine入门
  10. 因子分解机(FM) +场感知分解机 (FFM) 入门
  11. SLAM 学习笔记 本质矩阵E、基础矩阵F、单应矩阵H的推导
  12. google如何恢复误删除书签
  13. 为什么Service层要定义接口?
  14. 俞渝手撕李国庆:他是同性恋,李回应:变态精神病患者!大量细节惊呆网友...
  15. 手机订货系统的基本原理 帮助经销商卖货
  16. 既然不能独自养家糊口,的确就不应该去抱怨发牢骚
  17. wifi信号增强android,wifi信号增强器下载安装
  18. 多多情报通:拼多多蓝海词是什么意思?拼多多蓝海词怎么找?
  19. JSON压缩:JSONMinify
  20. 使用FeignClient注解,进行远程http第三方调用

热门文章

  1. 2018夏天的俄罗斯之旅
  2. Smartbi从交通工具演变看BI数据化运营历程
  3. Qt之实现移动的方块(蚂蚁线)
  4. figma那些好用的小技巧,你知道吗?
  5. 养猫还是养狗,哪一种宠物所受关注度更高?
  6. 接口--php对接农行网上支付平台-b2b
  7. EtherCAT从站物理层接口MIIEBUS简介
  8. 如何通过优化服务器提升网站的SEO排名
  9. 通达信l2接口公式如何使用?
  10. Experimental Educational Round: VolBIT Formulas Blitz A