找回密码
 注册
搜索
查看: 1341|回复: 15

[讨论] 请教一个宏定义

[复制链接]
发表于 2006-9-13 17:34:00 | 显示全部楼层 |阅读模式
这是一个关于晴中断的程序
其中rSRCPND, rINTPND已定义。
原代码如下:
001:  #define ClearPending(bit) {
002:                           rSRCPND = bit;
003:                           rINTPND = bit;
004:                             rINTPND;
                                    }  
问题:1。bit 未定义,为何能编译通过?
          2。 004行的 rINTPND 是何用意?
发表于 2006-9-13 18:56:00 | 显示全部楼层
bit是你的参数,所以不需定义。至于rINTPND就要看他本身怎么定义的了。
点评回复

使用道具 举报

 楼主| 发表于 2006-9-13 19:28:00 | 显示全部楼层
#define rINTPND     (*(volatile unsigned *)0x4a000010) //Interrupt request status
点评回复

使用道具 举报

 楼主| 发表于 2006-9-13 19:31:00 | 显示全部楼层
如果不定义bit的话,我们如何知道他的数据类型?
点评回复

使用道具 举报

 楼主| 发表于 2006-9-13 19:37:00 | 显示全部楼层
还有一个奇怪的现象,上面给出的代码是我修改过一点的。
原代码为:

#define ClearPending(bit) {                rSRCPND = bit;                rINTPND = bit;                rINTPND;                }     

注意其中的    “\”[/COLOR]  ,如果把他去掉的话,则无法编译通过,不管是在 ADS还是在 VC下。
点评回复

使用道具 举报

 楼主| 发表于 2006-9-13 19:39:00 | 显示全部楼层
还有一个奇怪的现象,上面给出的代码是我修改过一点的。
原代码为:

#define ClearPending(bit) {\    //////////////////////

                rSRCPND = bit;\    //

                rINTPND = bit;\    //

                rINTPND;\         //

                }      

注意其中的    “\”  ,如果把他去掉的话,则无法编译通过,不管是在 ADS还是在 VC下。
点评回复

使用道具 举报

发表于 2006-9-13 19:53:00 | 显示全部楼层
拜托你,\号表示续行,不加\你的宏定义只定义了一行
难道#define回会去给你自动匹配括号??
点评回复

使用道具 举报

 楼主| 发表于 2006-9-14 00:18:00 | 显示全部楼层
谢谢tritium的教导:) 终于用明白这个程序了。
谢谢。
点评回复

使用道具 举报

发表于 2006-9-14 11:50:00 | 显示全部楼层
建议这样写比较保险:


#define ClearPending(bit) do{                rSRCPND = bit;                rINTPND = bit;                rINTPND;                } while(0);
点评回复

使用道具 举报

发表于 2006-9-21 16:10:00 | 显示全部楼层
谢谢tritium的精彩回答.
点评回复

使用道具 举报

发表于 2006-9-28 12:24:00 | 显示全部楼层
为何要用Do...while语句呀?反正也就执行一次。
点评回复

使用道具 举报

发表于 2006-9-29 12:46:00 | 显示全部楼层
为什么要写do{}while(0)呢?
原因是这样的:

假设有这么一段代码:
if(need_clear_pending_bit)
    ClearPending(bit);
else
    do_something();

如果不用do{}while(0),那么你的宏定义被展成:
if(need_clear_pending_bit)
    rSRCPND = bit;  rINTPND = bit; rINTPND;
else
   do_something();
这个编译都通不过了!

除非你能保证每一次都这样写:
if(need_clear_pending_bit)
{
    ClearPending(bit);
}
else
    do_something();
但是你能保证别人都加括号么?
点评回复

使用道具 举报

发表于 2006-9-30 09:10:00 | 显示全部楼层
多谢,Tritium! 解了一个惑
点评回复

使用道具 举报

 楼主| 发表于 2006-9-30 11:45:00 | 显示全部楼层
再次感谢Tritium):)
点评回复

使用道具 举报

发表于 2006-10-3 22:34:00 | 显示全部楼层
<DIV class=quote><B>以下是引用<I>tritium</I>在2006-9-29 12:46:00的发言:</B>
为什么要写do{}while(0)呢?
原因是这样的:

假设有这么一段代码:
if(need_clear_pending_bit)
    ClearPending(bit);
else
    do_something();

如果不用do{}while(0),那么你的宏定义被展成:
if(need_clear_pending_bit)
    rSRCPND = bit;  rINTPND = bit; rINTPND;
else
   do_something();
这个编译都通不过了!

除非你能保证每一次都这样写:
if(need_clear_pending_bit)
{
    ClearPending(bit);
}
else
    do_something();
但是你能保证别人都加括号么?</DIV>



1. define宏已经把{}包含了
2. 喜欢用do...while的程序员不是好程序员
点评回复

使用道具 举报

发表于 2006-10-14 20:10:00 | 显示全部楼层
胡说啊?[em07]
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-9-29 18:05 , Processed in 0.048029 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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