C陷阱与缺陷第六章 预处理器
2017-07-26 10:44
232 查看
6.1 不能忽视宏定义中的空格
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都是指向结构的指针。
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缺陷与陷阱笔记-第六章 预处理器
- 【C陷阱和缺陷】预处理器
- C陷阱与缺陷(六)预处理器
- 【C陷阱和缺陷】预处理器
- 《C陷阱与缺陷》学习笔记总结:词法陷阱、语法陷阱、语义陷阱,连接、库函数、预处理器、可移植性缺陷及其他
- c缺陷与陷阱
- C陷阱与缺陷-整数的溢出
- "C陷阱和缺陷"中的几个知识点
- C++ 静态变量或成员初始化陷阱与缺陷
- c陷阱与缺陷 语法陷阱有感
- [美]Andrew Koenig -C陷阱与缺陷 - 整数溢出
- c陷阱与缺陷
- C陷阱与缺陷(三)--语义陷阱1
- C陷阱与缺陷总结
- C陷阱与缺陷第二章 语法“陷阱”
- C语言:陷阱和缺陷
- 【C陷阱和缺陷】词法缺陷和语法缺陷
- c陷阱与缺陷 学习笔记
- 读书笔记--C陷阱与缺陷(七)
- C Traps and Pitfalls (C语言陷阱和缺陷) 读书总结