现在的位置: 首页 > 综合 > 正文

C陷阱与缺陷书摘 —预处理器

2013年08月11日 ⁄ 综合 ⁄ 共 615字 ⁄ 字号 评论关闭

预处理:编译之前,由c语言预处理器对程序代码做的必要的转换处理。

 

宏只对程序的文本起作用,它提供了一种对组成c程序的字符进行变换的方法,而不作用于程序中的对象。


1. 宏不是函数

 

#define abs(x) (((x)>=0)?(x):-(x))

宏定义中出现的括号,它们的作用是预防引起与优先级相关的问题。

 

即使宏定义中的各个参数与整个结果表达式都被括号括起来,也仍然还可能有其他问题存在,比如说,一个操作数如果在两处被用到,就会被求值两次。

 

2. 宏不是类型定义

 

宏的常见用途是:使多个不同变量的类型可在一个地方说明。

 

#define FOOTYPE struct foo

FOOTYPE a,b;

 

但是,我们最好还是使用类型定义:

 

typedef struct foo FOOTYPE;

该语句定义FOOTYPE为一个新类型,与struct foo完全等效。

 

下面例子说明了为什么最好使用类型定义:

 

#define PCHAR char*

typedef char* pchar;

 

PCHAR p1, p2;

pchar p3, p4;     (notes:这段声明取自sponeliu的blog)

 

根据上下文,似乎是想将p1,p2,p3,p4都声明为char*类型的,但是,事实是如此么?p2是么?p2并没有预期成为一个char*类型,因为define会在预处理阶段展开,所以语句1就相当于 char* p1, p2;而在这条语句下,p2不是一个指针,而是一个char类型变量!

抱歉!评论已关闭.