在#if #else条件编译时候用枚举变量做条件对比易出错,建议#if #else条件编译结合宏#define使用
使用#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使用相关推荐
- 光遇服务器维护都在干什么,光遇:全图毕业后该做什么?老玩家建议,这四件事不做会后悔...
原标题:光遇:全图毕业后该做什么?老玩家建议,这四件事不做会后悔 光遇:全图毕业后该做什么?老玩家建议,这四件事不做会后悔 前言: 大家好,我是喜欢玩游戏.聊游戏的孟婆小叔.游戏里的毕业,即六大地图的 ...
- myBatis的xml映射文件中传入list集合与数组做条件
mybatis的xml映射文件中传入list集合与数组做条件 1.传list集合参数 1.1sql映射: <select id="queryDeptListByBankLevelAnd ...
- 判断参数大于0_能做条件判断的文本函数
我们知道文本函数的一般作用就是查找.替换.提取文本等等,可是能做条件判断的文本函数你见过吗?不仅如此,它还可以让日期变数字.数字变大写.金额变万元等等.说到这里,屏幕前的小伙伴有猜到它是谁吗? 在Ex ...
- ftl if else判断_为什么都不用 switch 而使用 if/ else 来做条件判断?
Java技术栈 www.javastack.cn 关注优质文章 请用5秒钟的时间查看下面的代码是否存在bug. 推荐阅读:switch case 支持的数据类型. OK,熟练的程序猿应该已经发现Bug ...
- Java是先难后易吗_做题先易后难,干活先难后易
1 事儿难长智慧, 事儿易生愚昧. 2 诞生容易,做好人难: 说话容易,把话说好难: 走平道容易,上天入地都难: 吃饭容易,种地掙钱都难: 学过的容易,没学的都难: 事做起来容易,不做都难: 吃胖容易 ...
- ibm linux mq 发送消息_RabbitMq、ActiveMq、Kafka和Redis做Mq对比
一.RabbitMq RabbitMQ是一个Advanced Message Queuing Protocol(AMQP)的开源实现,由以高性能.可伸缩性出名的Erlang写成.RabbitMQ Se ...
- 【AI初识境】给深度学习新手做项目的10个建议
这是专栏<AI初识境>的第12篇文章.所谓初识,就是对相关技术有基本了解,掌握了基本的使用方法. 在成为合格的深度学习算法工程师,尤其是工业界能够实战的调参选手之前,总会踏足很多的坑. 今 ...
- THYMELEAF 如何用TH:IF做条件判断
TestController 增加一个布尔值数据,并且放在model中便于视图上获取 package com.how2java.springboot.web; import java.util.Arr ...
- jquer each 遍历的结果不显示 null_SpringBoot系列(三十一)- Thymeleaf如何用th:each 做条件遍历
步骤1:基于前面的知识点步骤2:先运行,看到效果,再学习步骤3:模仿和排错步骤4:TestController步骤5:普通遍历步骤6:带状态的遍历步骤7:结合 select步骤8:结合 单选框步骤9: ...
最新文章
- 搜索目录下 匹配文件中 最新的文件 路径
- 手把手带你使用JS-SDK自定义微信分享效果
- python中__init__.py的作用、module和package
- stylus之方法(Functions)
- Windows核心编程(笔记13) 第十六章--第二十六章
- SciPy 非线性方程求解 | Python技能树征题
- 《冰河的渗透实战笔记》电子书,442页,37万字,正式发布!!
- QT5.11下载与安装教程
- 数据清洗案例 OpenRefine入门
- 因子分解机(FM) +场感知分解机 (FFM) 入门
- SLAM 学习笔记 本质矩阵E、基础矩阵F、单应矩阵H的推导
- google如何恢复误删除书签
- 为什么Service层要定义接口?
- 俞渝手撕李国庆:他是同性恋,李回应:变态精神病患者!大量细节惊呆网友...
- 手机订货系统的基本原理 帮助经销商卖货
- 既然不能独自养家糊口,的确就不应该去抱怨发牢骚
- wifi信号增强android,wifi信号增强器下载安装
- 多多情报通:拼多多蓝海词是什么意思?拼多多蓝海词怎么找?
- JSON压缩:JSONMinify
- 使用FeignClient注解,进行远程http第三方调用