OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4190|回复: 2

突然发现一个C语言的问题~~#if 判断中使用enum定义的问题

[复制链接]

22

主题

180

帖子

1

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2015-6-29
在线时间
101 小时
发表于 2016-1-8 13:23:40 | 显示全部楼层 |阅读模式
10金钱
问题描述如下:
1、正确的情况:#define     OV_2640          (0x2640)            
#define     OV_7670          (0x7670)

//使用什么摄像头
#define OV_TYPE     OV_7670
#ifndef OV_TYPE
    #define OV_TYPE  OV_2640  
#endif

#if(OV_TYPE == OV_2640)
{        

}
#elif(OV_TYPE == OV_7670)
{
     //正确进入这个编译分支
}
#endif

2、错误的情况:
typedef enum
{
    OV_2640          = (uint8_t)0,
    OV_7670,
}E_OVType;

//使用什么摄像头
#define OV_TYPE     OV_7670
#ifndef OV_TYPE
    #define OV_TYPE  OV_2640   
#endif


#if(OV_TYPE == OV_2640)
{        
     //反而是进入了这个编译分支
}
#elif(OV_TYPE == OV_7670)
{
     //没有进入这个编译分支
}
#endif




我通过#if判断语言来选择编译分支,发现#if 判断时使用的是#define定义的变量就没问题,但使用enum定义的就有问题~~这个问题我觉得很奇怪,可能描述不太清楚,难道是我C语言没学好?请教一下各位大神讲解一下,谢谢啦

最佳答案

查看完整内容[请看2#楼]

哈哈,找到答案了,的确是我C语言没学好~~ #if 是在预处理阶段处理, enum这些是在编译阶段, 所以,enum定义的东西,对#if来说还没有出现呢。
我是菜鸟
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

22

主题

180

帖子

1

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2015-6-29
在线时间
101 小时
 楼主| 发表于 2016-1-8 13:23:41 | 显示全部楼层
哈哈,找到答案了,的确是我C语言没学好~~

#if 是在预处理阶段处理,

enum这些是在编译阶段,

所以,enum定义的东西,对#if来说还没有出现呢。
我是菜鸟
回复

使用道具 举报

16

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1292
金钱
1292
注册时间
2014-12-20
在线时间
534 小时
发表于 2016-1-8 14:28:16 | 显示全部楼层
本帖最后由 BMN李 于 2016-1-8 16:30 编辑

首先下面这个定义了但没有使用它。你可以注释了看,结果是一样的。
typedef enum
{
    OV_2640          = (uint8_t)0,
    OV_7670,
}E_OVType;

其次我们把下面这段代码用宏替换一下。
//使用什么摄像头
#define OV_TYPE     OV_7670
#ifndef OV_TYPE
    #define OV_TYPE  OV_2640   
#endif

#if(OV_TYPE == OV_2640)
{        
     //反而是进入了这个编译分支
}
#elif(OV_TYPE == OV_7670)
{
     //没有进入这个编译分支
}
#endif

替换结果为
#if(OV_7670 == OV_2640)
{        
     //反而是进入了这个编译分支
}
#elif(OV_7670 == OV_7670)
{
     //没有进入这个编译分支
}
#endif
而OV_7670 和 OV_2640均未定义,所以是相等的值。其实两个判断都是满足的,但第二个判断是else所以没有进入编译分支,你可以用两个#if #endif来验证。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-22 04:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表