Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103561
  • 博文数量: 16
  • 博客积分: 1435
  • 博客等级: 上尉
  • 技术积分: 170
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-15 18:51
个人简介

Software

文章分类

全部博文(16)

文章存档

2012年(1)

2011年(1)

2010年(2)

2009年(1)

2008年(6)

2007年(5)

我的朋友

分类: C/C++

2007-06-22 18:43:15

在C/C++语言里,Macro(宏指令)是非常有用的。
有一招数我还是从别人那里学来的。
它省列了编程者的打字工作。
完全的使用了编译器的强大功能来简化我们的工作。
而且也使原码易读简洁也方便使用。
 
例如有一个自定的函数是如下:
 
WORD inp_chkbit(int card_no,int port_no, IODATA_TYPE bit);
这是一个读取输入埠里其中一个bit的函数。(1 byte=8 bits, 1 word=16 bits)
可以如此的应用,
 
if (inp_chkbit(0, 0x240, 0x01))    //if input bit ON
{
    .....    //Do something
}
 
但是如此的编程,相信很难理解 0,0x240,0x01是代表了什么。
尤其当这个函数大量的使用时,输入(input bit)众多时,是相当难懂的。
即使你有超强的记忆力也难把所有的I/O都记住。
如果又把代码交给他人去帮你除虫,那么他一定会吐血而死的,呵...
 
我最初的做法就是把这些数字用文字来带表而已。
例如:
 
#define    CARD_0    0
#define    CARD_1    1
....
 
#define    PORTA      0x240
#define    PORTB      0x241
#define    PORTC      0x242
....
 
#define    INPUT_1    0x01
#define    INPUT_2    0x02
#define    INPUT_3    0x04
#define    INPUT_4    0x08
....
 
if (inp_chkbit(CARD_0, PORTA, INPUT_1))    //if input bit ON
{
    .....    //Do something
}
 
这虽然是易读了许多,但是在编程上往往会很容易弄错port_no和card_no的。
如果这个机器里有百多两百个I/O,要确定所有的参数都是正确的使用,还蛮麻烦的。
 
多年以前,我在跟进别人的程序时,看到了一个很高明的做法。
于是我就将它在我的程序里“发扬光大”了!呵...
例子:
 
#define    INPUT_1    CARD_0, PORTA, 0x01
#define    INPUT_2    CARD_0, PORTA, 0x02
#define    INPUT_3    CARD_0, PORTA, 0x04
#define    INPUT_4    CARD_0, PORTA, 0x08
....
 
if (inp_chkbit(INPUT_1))    //if input bit ON
{
    .....    //Do something
}
 
如以上的代码,真的就非常容易读了,也不会弄错它的参数。
他以一个label来代替了三个参数,真的很高明。
以前还真的没去想过如此的用法呢!
真有一语惊醒梦中人的感觉,呵...
这真可说是C/C++的艺术哦!
所以说C/C++是一级棒的!呵...

阅读(2127) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~