11061|5

26

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

关于Keil预处理中#define语句和#include语句的顺序问题 [复制链接]

 

关于Keil预处理中#define语句和#include语句的顺序问题

  今天在学习TIstellaris luminary LM3S9B96的固件移植过程中,发现了一个问题,叙述如下:

 

  由于固件中的pin_map.h文件中包含了LM3S所有芯片型号的引脚映射,所以当为某一特定的芯片进行引脚映射时,要通过#define PART_LM3Sxxxx 语句选择特定的宏定义段。Pin_map.h中关于LM3S9B96的宏定义段如下图所示:

但编译却并没有通过,而是出现了如下图所示的提示:

可见,图片二中的宏定义段并没有加载到.C的文件中,但当把#define PART_LM3S9B96语句调整到所有#include 语句之前时,如下图所示:

再次进行编译链接,则成功了

综上所述,自然而然地产生如下的疑问:Keil在进行预处理时,是把#define语句和#include语句分类地分开进行编译的吗?即在一个文件中当#include语句为第一条语句时,则编译器先把此文件中所有的#include语句处理完,才转而处理#define语句。不知小弟分析的对不对,还请熟悉预处理过程的大神给予指点!!!

最新回复

编译器只扫描一遍源码产生需要的编译信息,扫描过程就是按顺序把define,include,和源码混合在一起产生一个编译处理文件,到这步之前都是预处理过程。include实际上就是加入其它文件的内容。 #ifdef是个条件即是否定义过这个常量,扫描到这句时进行判断,如果成立则存在后面的内容有效(到#enddef),如果不成立后面部分视为不存在。 你的define part.... 只要放在#ifdef之前都为真,没有或再#ifdef之后都为假  详情 回复 发表于 2013-7-8 21:29

点评

应该就是按照先后顺序吧.  详情 回复 发表于 2013-7-8 10:25
 
点赞 关注

回复
举报

1727

帖子

0

TA的资源

五彩晶圆(初级)

沙发
 
这个编译的时候是有先后顺序的,你检查下你第一个没编译过的,上面几个#include 里面是否有用到#define PART_LM3S9B96 的东西!

点评

没有了,只有pin_map.h里面有#define PART_LM3S9B96。  详情 回复 发表于 2013-7-8 22:58
 
 

回复

1803

帖子

0

TA的资源

五彩晶圆(高级)

板凳
 

回复 楼主无物之象 的帖子

应该就是按照先后顺序吧.
 
 
 

回复

4008

帖子

0

TA的资源

版主

4
 
编译器只扫描一遍源码产生需要的编译信息,扫描过程就是按顺序把define,include,和源码混合在一起产生一个编译处理文件,到这步之前都是预处理过程。include实际上就是加入其它文件的内容。
#ifdef是个条件即是否定义过这个常量,扫描到这句时进行判断,如果成立则存在后面的内容有效(到#enddef),如果不成立后面部分视为不存在。
你的define part.... 只要放在#ifdef之前都为真,没有或再#ifdef之后都为假

点评

的确是这样,我发现我的问题了。原来在gpio.h的那个文件夹里有这样一段宏指令: #ifndef DEPRECATED #include \"pin_map.h\" #endif 那就是在#define PART_LM3S969B 这句换之前已经包含进 pin_map.h这个文件了,  详情 回复 发表于 2013-7-8 23:08
 
 
 

回复

26

帖子

0

TA的资源

一粒金砂(中级)

5
 

回复 沙发cat3902982 的帖子

没有了,只有pin_map.h里面有#define PART_LM3S9B96。
 
 
 

回复

26

帖子

0

TA的资源

一粒金砂(中级)

6
 

回复 4楼huo_hu 的帖子

的确是这样,我发现我的问题了。原来在gpio.h的那个文件夹里有这样一段宏指令:
#ifndef DEPRECATED
#include "pin_map.h"
#endif
那就是在#define PART_LM3S969B 这句换之前已经包含进 pin_map.h这个文件了,而#define PART_LM3S969B  这句话之后的#include 语句就被忽略了。。。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
【有奖直播】2025是德科技数字月-数字新品来助阵
直播时间:3月19日(周三)14:00
直播奖励:小米口红充电宝、倍思充电线、是德科技十周年鼠标垫

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表