C陷阱与缺陷第六章 预处理器

6.1 不能忽视宏定义中的空格

define f (x) ((x)-1) //f 代表 (x) ((x)-1)

6.2 宏并不是函数

define abs(x) (((x) >= 0) ? (x) : - (x)) //宏定义中出现的所有括号,作用是预防引起与优先级有关的问题。

使用宏的另一个危险是,宏展开可能产生非常庞大的表达式,占用的空间远远超过所期望的空间。

6.3 宏并不是语句
6.4 宏并不是类型定义
宏的一个常见用途是,使多个不同变量的类型可在一个地方说明:
#define FOOTYPE struct foo
FOOTYPE a;
FOOTYPR b, c;
这样,编程者只需在程序中改动一行代码,即可改变a,b,c的类型;
但是最好还是使用类型定义:typedef struct foo FOOTYPE;
例如:#define T1 struct foo*
typedef struct foo *T2;
从定义上看,T1和T2从概念上完全相同,都是指向结构foo的指针,但用他们声明多个变量时,会出现问题:T1 a, b;
T2 a, b;
第一个声明被扩展为:struct foo *a, b; //a被定义为一个指向结构的指针,而b却被定义却不是指针;
第二个声明则不同,它定义了a和b都是指向结构的指针。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值