OpenEdv-开源电子网

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

关于ifdef与ifndef的区别

[复制链接]

9

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2016-1-28
在线时间
37 小时
发表于 2016-1-28 23:56:12 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 yibiejiangtian 于 2016-1-29 00:00 编辑

看战舰V3视频中系统时钟初始化这一节,讲到void SystemInit (void)中的条件编译,关于下面这段程序:

#ifndef STM32F10X_CL  
RCC->CFGR &= (uint32_t)0xF8FF0000;
#else
  RCC->CFGR &= (uint32_t)0xF0FF0000;
原子哥讲的是编译#else下面这句,大容量定义的是STM32F10X_HD,也就是没定义STM32F10X_CL,查寄存器发现原子哥讲的应该是没错的,但是网上的资料全部都是这样讲的:
#ifndef x      //先测试x是否被宏定义过  
程序段1       //如果x没有被宏定义过,那么就编译程序段1   
#endif  
程序段2       //如果x已经定义过了则编译程序段2的语句,“忽视”程序段1。


这种说法刚好和原子哥视频中说的相反,到底哪种解释是正确的?还有下面这种说法应该是正确的吧
#ifdef 标识符
程序段1
#else
程序段2
#endif
上述语句作用是当标识符已经被定义过,则对程序段1进行编译,否则编译程序段2








最佳答案

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

两个都对!一个是ifdef一个是ifndef 楼主看看这个 http://c.biancheng.net/cpp/html/68.html
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

794

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
1502
金钱
1502
注册时间
2015-3-3
在线时间
460 小时
发表于 2016-1-28 23:56:13 | 显示全部楼层
本帖最后由 hpeng1874 于 2016-1-29 10:39 编辑

两个都对!一个是ifdef一个是ifndef

楼主看看这个    http://c.biancheng.net/cpp/html/68.html
回复

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-1-29 08:17:45 | 显示全部楼层
#ifndef x
程序1
#else
程序2
#endif

上述x如果被定义则编译程序2,没有被定义则编译程序1
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

9

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2016-1-28
在线时间
37 小时
 楼主| 发表于 2016-1-29 13:36:45 | 显示全部楼层
hpeng1874 发表于 2016-1-29 10:34
两个都对!一个是ifdef一个是ifndef

楼主看看这个    http://c.biancheng.net/cpp/html/68.html

ifdef那个没问题,但是ifndef的和原子哥说的对不上,我前面讲的那部分是我们定义了STM32F10X_HD,没有定义STM32F10X_CL,那么按照大家说的网上的资料这部分程序#ifndef STM32F10X_CL  
RCC->CFGR &= (uint32_t)0xF8FF0000;
#else
  RCC->CFGR &= (uint32_t)0xF0FF0000;
应该是执行#else上面那句,但按照原子哥的说法和程序注释去查询寄存器配置,应该是执行#else下面那句是对的,两种还是对不上
回复

使用道具 举报

9

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2016-1-28
在线时间
37 小时
 楼主| 发表于 2016-1-29 13:41:22 | 显示全部楼层

我说的那个第一段程序,没有定义STM32F10X_CL,那应该是是执行#else上面那句,但是原子哥讲的是执行#else底下那句,我查了寄存器配置和程序的功能注释,貌似原子哥讲的是对的,但是就和大家说的执行上面那句对不上
回复

使用道具 举报

9

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2016-1-28
在线时间
37 小时
 楼主| 发表于 2016-1-29 23:47:13 | 显示全部楼层
本帖最后由 yibiejiangtian 于 2016-1-30 17:43 编辑

我发现可能是视频中讲解有误,应该是执行前面那个程序段没错
回复

使用道具 举报

4

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
498
金钱
498
注册时间
2015-10-3
在线时间
65 小时
发表于 2016-4-10 22:28:55 | 显示全部楼层
学习了
回复

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2016-1-26
在线时间
11 小时
发表于 2016-11-1 10:59:15 | 显示全部楼层
666666666666666666666666666666
回复

使用道具 举报

cckrocket 该用户已被删除
发表于 2017-2-4 14:21:33 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

2

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2017-8-4
在线时间
3 小时
发表于 2018-1-31 12:50:09 | 显示全部楼层
我也发现了,感觉是原子讲错了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-25 23:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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