预处理器
预处理器使得编程者可以简化某些工作,它的重要性可以由两个主要的原因说明
- 一改全改,需要将某个特定数量在程序中出现的所有实例统统加以修改,我们希望能够通过在程序中之修改一处数值,然后重新编译就可以实现。
- 函数调用时会带来重大的系统开销,但是宏虽然看上去像一个函数,但是却没有函数调用的开销。
宏虽然有用,但是宏只是对程序的文本起作用,也就是说,宏提供了一种对组成 C 程序的字符进行替换的方式,而不作用于程序中的对象。
不能忽视宏定义中的空格
例如:
#define f (x) ((x) - 1)
那么上面宏代表的就是
(x)((x) - 1)
宏并不是函数
-
宏定义中最好把每个参数都用括号括起来,同样,整个结果表达式也应该用括号括起来,以防止当宏用于一个更大的表达式可能出现的问题。
-
确保宏参数没有引起
副作用 -
宏展开可能产生非常庞大的表达式,占用的空间远远超过了编程者所期望的空间。
宏并不是语句
宏并不是类型定义
#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 都是指向结构的指针,因为这里 T2 的行为 完全与一个真实的类型相同。
867

被折叠的 条评论
为什么被折叠?



