OpenEdv-开源电子网

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

关于条件编译#if,#if defined

[复制链接]

4

主题

11

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2014-11-27
在线时间
2 小时
发表于 2014-11-27 15:33:35 | 显示全部楼层 |阅读模式
5金钱
以前只写过51单片机的一些简单控制程序,没有用过#if之类的条件编译。现在刚接触ARM编程,很多问题不懂,大家不要嫌啊。
买了一块407探索者的开发板,看例程时,很多条件编译语句,也就上网猛补这方面知识。
《STM32F4开发指南-库函数版本》,在64页,关于把 PLL 第一级分频系数 M修改为8这部分。
下面是system_stm32f4xx.c关于配置PLL的代码:
#if defined (STM32F40_41xxx) || defined (STM32F427_437xx) || defined (STM32F429_439xx) || defined (STM32F401xx)
/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
#define PLL_M      8

第一句:#if defined (STM32F40_41xxx) || defined (STM32F427_437xx) || defined (STM32F429_439xx) || defined (STM32F401xx)
意思是如果宏定义过STM32F40_41xxx,STM32F427_437xxSTM32F429_439xx,STM32F401xx中的一个,则宏定义PLL_M为8。
应该没有理解错吧?
然后去找
宏定义STM32F40_41xxx的地方,只在stm32f4xx.h找到以下语句:
/* Old STM32F40XX definition, maintained for legacy purpose */
#ifdef STM32F40XX
  #define STM32F40_41xxx
#endif /* STM32F40XX */
这段的意思是如果STM32F40XX宏定义过,则宏定义STM32F40_41xxx,理解没错吧?
接着又去找
STM32F40XX的宏定义,没有找到。其他STM32F427_437xxSTM32F429_439xxSTM32F401xx类似。

那么STM32F40_41xxx在哪里被宏定义的?或者STM32F40XX在哪里被宏定义过?



最佳答案

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

333

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1838
金钱
1838
注册时间
2012-7-16
在线时间
504 小时
发表于 2014-11-27 15:33:36 | 显示全部楼层
回复

使用道具 举报

4

主题

11

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2014-11-27
在线时间
2 小时
 楼主| 发表于 2014-11-27 17:08:52 | 显示全部楼层
原来在这。明白了。
那是不是也可以在实际头文件中直接宏定义呢?
在stm32f4xx.h中第68行:
#if !defined (STM32F40_41xxx) && !defined (STM32F427_437xx) && !defined (STM32F429_439xx) && !defined (STM32F401xx) && !defined (STM32F411xE)
  /* #define STM32F40_41xxx */   /*!< STM32F405RG, STM32F405VG, STM32F405ZG, STM32F415RG, STM32F415VG, STM32F415ZG,  

如果不将下面那行注释掉“#define STM32F40_41xxx”,那么是不是可以达到同样的目的?也就不用在编译器上填写“STM32F40_41xxx”?

USE_STDPERIPH_DRIVER同理。
#if !defined  (USE_STDPERIPH_DRIVER)
/**
 * @brief Comment the line below if you will not use the peripherals drivers.
   In this case, these drivers will not be included and the application code will 
   be based on direct access to peripherals registers 
   */
  /*#define USE_STDPERIPH_DRIVER */
#endif /* USE_STDPERIPH_DRIVER */

在编译器里定义和在头文件里定义有什么区别?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-11-27 20:12:58 | 显示全部楼层
回复【3楼】XXDJ:
---------------------------------
可以
区别就是编译器定义,是对整个工程的。
头文件定义,是针对调用了这个头文件的c文件有效。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

11

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2014-11-27
在线时间
2 小时
 楼主| 发表于 2014-11-28 09:16:44 | 显示全部楼层
谢谢!
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2015-7-31
在线时间
8 小时
发表于 2015-11-23 15:09:57 | 显示全部楼层
论坛强大  我也遇到了 挖坟贴
回复

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2016-1-4
在线时间
31 小时
发表于 2016-2-26 17:20:24 | 显示全部楼层
学习模板时就在想为啥要在编译设置里复制STM32F40_41xxx,USE_STDPERIPH_DRIVER 现在明白了。感谢楼主与原子大神
回复

使用道具 举报

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2016-7-27
在线时间
14 小时
发表于 2016-10-6 14:38:46 | 显示全部楼层
感谢感谢,加深了理解!棒棒哒
回复

使用道具 举报

3

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2015-10-28
在线时间
56 小时
发表于 2016-11-8 15:30:34 | 显示全部楼层
今天终于明白了,谢谢强大的论坛
回复

使用道具 举报

2

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2019-5-6
在线时间
32 小时
发表于 2020-7-11 17:06:23 | 显示全部楼层
11111111
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-1 01:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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