您的位置:首页 > 编程语言 > C语言/C++

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

2017-07-26 10:44 232 查看
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都是指向结构的指针。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言