typedef,#define与sbit

typedefy

typedef是在编译时处理的。它在自己的作用域内给一个已经存在的类型一个别名。

(1)一方面直接用uint代替 unsigned int.另一方面,它增强了程序的可移植性,因为有的系统是4个字节存放一个整数,有的是两个字节。

typedef unsigned int uint;

(2)有时候,它并不是简单的字符替换,例如

typedef int num[10];
num a;
这时候,a是一个含有10个元素的数组名


#define

#define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入

(2) 边界效应
A. 未加括号带来的边界效应
由于宏定义的时候,其各个分量未加括号,而在使用宏定义的时候,传递的参数是变量的表达式,然后经过系统展开后,由于优先级的原因,导致其结果不是你所希望的.
[例子]
#define MUL(A,B) A*B
  • 1

而在使用的时候,这样的调用:
int a=1,b=2,c=3,d=0;
d=MUL(a+b,c)
经过编译时候展开,就变成了
d=a+b*c
而不是我们所希望的
d=(a+b)*c
[解决办法]
其解决办法也很简单,就是给每个分量,都加上括号,就可以避免此类问题
即,在宏定义的时候,如此定义:

#define MUL(A,B) ((A)*(B))

http://blog.csdn.net/jesons_/article/details/51702149


sbit

sbit是外部位声明,就是单片机的外部端口。

当给某个具体的端口赋高低电平时,像P2^2=0是编译不通过的。

必须sbit lsa=P2^2;  lsa=0;

如果,这样写#define lsa P2^2     lsa=0;是不能通过编译。因为预编译时候,直接将lsa换成P2^2,导致P2^2=0,结果编译失败。

但是,P0=0x**,可以直接赋值。(#define led P0     led=0x**;可以通过编译正确运行)

那么,为什么P0可以直接赋值,P0^2不可以。




猜你喜欢

转载自blog.csdn.net/sinat_38816924/article/details/78616606