打印

keil里面如何在编译时检查赋值是否正确?

[复制链接]
9542|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 juginhine 于 2010-6-9 15:57 编辑

现在用keil调试的时候,我想实现就是c里面语句的赋值是否正确或者超出了范围。我希望这个检查是在编译过程。如果出现不正确或者超出范围,就直接用error提示。
我看过keil里面有断言assert,可是那个并不能实现我这个参数检查,不知道大家有什么好的方法建议。谢谢?

相关帖子

沙发
冷漠| | 2010-6-10 17:14 | 只看该作者
哪本书上都有:  #error 伪指令
假定MYVAL的值只能为0或1,#error指令在编译过程中捕捉意外:

#if(MYVAL!=0 && MYVAL!=1)
Error: 文件名 line#: Error directive:  errmsg

使用特权

评论回复
板凳
juginhine|  楼主 | 2010-6-11 08:48 | 只看该作者
多谢2楼的回复。
那我可以这样操作吗?
#define DIV 16.6
#define MAX_VAL 65535/DIV
#define TMR_INTERVAL  2000
#if (TMR_INTERVAL > MAX_VAL)
    #error "tmr_interval is greater the max value"
#endif
可是这样操作后,keil编译会报错啊。不知道大家有试过这样操作没有?

使用特权

评论回复
地板
冷漠| | 2010-6-12 14:56 | 只看该作者
真逗。哪报错了?


使用特权

评论回复
5
hgjinwei| | 2010-6-12 18:45 | 只看该作者
:lol3#让 TMR_INTERVAL > MAX_VAL 成立了,所以就报错了

使用特权

评论回复
6
juginhine|  楼主 | 2010-6-13 08:37 | 只看该作者
将 #define DIV 16.6
而不是 #define DIV 16
这是第一步测试,
然后 #define TMR_INTERVAL  5000为第二部测试。
不知道大家这样测试的结果如何???

使用特权

评论回复
7
ayb_ice| | 2010-6-13 09:06 | 只看该作者
本帖最后由 ayb_ice 于 2010-6-13 09:10 编辑

KEIL
#warning输出用户警告信息
#error输出用户错误信息<编译器会放弃继续编译>
#message输出用户信息
一般其它编译器也有这功能
如:
#warning "这是个用户警告信息"
#error"这是个用户错误信息"
#message"这是个用户提示信息"
....

使用特权

评论回复
8
juginhine|  楼主 | 2010-6-13 11:21 | 只看该作者
是的,keil的这几个提示功能我也知道,可是我现在只是想利用这几个功能来实现在编译的时候,对初始化时的初始值进行正确性校验。
可是当我如下利用的时候,发现编译出错。
#define DIV 16.6
#define MAX_VAL 65535/DIV
#define TMR_INTERVAL  2000
#if (TMR_INTERVAL > MAX_VAL)
    #error "tmr_interval is greater the max value"
#endif

使用特权

评论回复
9
ayb_ice| | 2010-6-13 11:41 | 只看该作者
去年括号
#define DIV 16.6
#define MAX_VAL  65535/DIV
#define TMRINTERVAL  20000

#if TMRINTERVAL > MAX_VAL
        #error "tmr_interval is greater the max value"
#endif

使用特权

评论回复
10
hgjinwei| | 2010-6-13 12:27 | 只看该作者
关键点不在那个括号,而是"#define DIV 16.6"

编译错误信息已经说明了: error:  #31: expression must have integral type
表达式必须是整数形式!

使用特权

评论回复
11
冷漠| | 2010-6-13 13:15 | 只看该作者
10楼一语道破。"#define DIV 16.6 "  ? 玩什么呢,莫名其妙。

使用特权

评论回复
12
juginhine|  楼主 | 2010-6-13 16:47 | 只看该作者
我自己也测试了好几遍,关键的不是那个 #define DIV 16.6,而是 #if (TMR_INTERVAL > MAX_VAL) 这条语句。
因为我去掉这条判断语句后,在主程序里面直接使用 MAX_VAL  的值都是对的。也就是说 keil 其实是支持在编译阶段对浮点型数据进行运算的。只是不懂为什么 #if 判断语句就不行了?即使我前面增加(cint)之类的标识符也还是错。

我反过来请教好了。因为我这个只是想在编译过程对自己定义的初始化数据进行合理性检查和报错。不知道大家有什么好的方法对数据进行合理的检查和报错??

使用特权

评论回复
13
voidx| | 2010-6-13 16:57 | 只看该作者
本帖最后由 voidx 于 2010-6-13 16:58 编辑

楼主google搜索 __assert__

楼主搜到结果要给分。

使用特权

评论回复
14
原野之狼| | 2010-6-13 17:12 | 只看该作者
既然不支持浮点 那搞成整数呗
再不行的话就在运行时检查

使用特权

评论回复
15
juginhine|  楼主 | 2010-6-13 17:12 | 只看该作者
呵呵我看过 keil 里面的 assert 宏。但是那个宏定义的是在程序运行过程中检查数据的合法性。然后通过串口输出。运行中确实可以用 assert 来对数据检查,如果数据非法可以中断程序并输出哪里错误。
我现在想做的是在编译阶段而不是运行中对数据进行合法性检查。

使用特权

评论回复
16
voidx| | 2010-6-13 17:16 | 只看该作者
本帖最后由 voidx 于 2010-6-13 22:11 编辑

#define __assert__(exp)  extern char __assert_data__[((int)(exp)) ? 1:-1]


__assert__(exp);
优点:
1.编译时检查参数,不产生任何代码
2.exp不仅可以是字面值常量,也可以常量表达式
3.既可以放在函数内,也可以放在函数外。
4.常量表达式可使用浮点。

使用特权

评论回复
17
原野之狼| | 2010-6-13 17:18 | 只看该作者
#define DIV 166
#define MAX_VAL 655350/DIV
#define TMR_INTERVAL  20000
#if (TMR_INTERVAL > MAX_VAL)
    #error "tmr_interval is greater the max value"
#endif

编译一下
fatal error C1189: #error :  "tmr_interval is greater the max value"

正合LZ的意思

使用特权

评论回复
18
xlsbz| | 2010-6-13 19:37 | 只看该作者
真是好贴啊!

这个东西我还真没弄过!希望有用啊!

冷漠 真是 牛!

使用特权

评论回复
19
xlsbz| | 2010-6-13 19:38 | 只看该作者
:victory:

使用特权

评论回复
20
xlsbz| | 2010-6-13 19:39 | 只看该作者
2# 冷漠


是不是搞个枚举?就OK!!!

哈哈 题外话。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

180

帖子

0

粉丝