OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 1810|回复: 9
打印 上一主题 下一主题

关于ifdef与ifndef的区别

[复制链接]

  离线 

9

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
191
金钱
191
注册时间
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

回复

使用道具 举报

  离线 

3

主题

796

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
1502
金钱
1502
注册时间
2015-3-3
在线时间
460 小时
2#
发表于 2016-1-28 23:56:13 | 只看该作者
本帖最后由 hpeng1874 于 2016-1-29 10:39 编辑

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

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

使用道具 举报

  离线 

114

主题

7514

帖子

12

精华

资深版主

Rank: 8Rank: 8

积分
10938
金钱
10938
注册时间
2013-9-10
在线时间
342 小时
3#
发表于 2016-1-29 08:17:45 | 只看该作者
#ifndef x
程序1
#else
程序2
#endif

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

使用道具 举报

  离线 

9

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
191
金钱
191
注册时间
2016-1-28
在线时间
37 小时
4#
 楼主| 发表于 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

积分
191
金钱
191
注册时间
2016-1-28
在线时间
37 小时
5#
 楼主| 发表于 2016-1-29 13:41:22 | 只看该作者

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

使用道具 举报

  离线 

9

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
191
金钱
191
注册时间
2016-1-28
在线时间
37 小时
6#
 楼主| 发表于 2016-1-29 23:47:13 | 只看该作者
本帖最后由 yibiejiangtian 于 2016-1-30 17:43 编辑

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

使用道具 举报

  离线 

4

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
489
金钱
489
注册时间
2015-10-3
在线时间
65 小时
7#
发表于 2016-4-10 22:28:55 | 只看该作者
学习了
回复

使用道具 举报

  离线 

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2016-1-26
在线时间
11 小时
8#
发表于 2016-11-1 10:59:15 | 只看该作者
666666666666666666666666666666
回复

使用道具 举报

cckrocket 该用户已被删除
9#
发表于 2017-2-4 14:21:33 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

  离线 

2

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2017-8-4
在线时间
3 小时
10#
发表于 2018-1-31 12:50:09 | 只看该作者
我也发现了,感觉是原子讲错了
回复

使用道具 举报

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

本版积分规则




QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-2-20 15:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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