《你必须知道的495个C语言问题》笔记--C预处理器
来源:互联网 发布:阿里云注销 编辑:程序博客网 时间:2024/05/01 17:25
如何正确定义函数式宏?
宏扩展是纯粹的文本扩展,为了避免意外,在定义函数式宏的时候,请记住下边的三条规则:
1.宏扩展必须使用括号,以便保护表达式中低优先级的操作符,例如:
#define square(x) x*x
调用
1 / suqare(n)
会被扩展为
1 / n * n
这等价于(1 / n) * n 而你需要的是:
1 / (n * n)
在这里,问题出在结合性而不是优先级上,但是效果是一样的。
2.在宏定义内部,所有的参数的出现都必须使用括号括起来,以便保护实参中任何低优先级的操作符不受宏扩展其他部分的
影响。同样以squre()为例,调用
square(n + 1)
会被扩展为
n+1 * n+1
但你需要的是
(n+1) * (n+1)
3.如果一个参数在扩展中出现了多次,而实参是带副作用的表达式,则宏可能不能正确运行,再以squre宏为例,调用
square(i++)
会被扩展为
i++ * i++
遵循规则1和规则2的正确的square宏的定义应该是
#define square(x) ((x) * (x))
完整的头文件搜索规则是怎样的?
通常,用<>命名的头文件会先在一个或多个标准位置搜索。用“”命名的头文件会首先在“当前目录”搜索,然后再在标准位置
搜索。(标准只规定了用“”命名的文件也会按照<>文件的方式搜索)
另一个区别在于“”文件的“当前目录”的定义。传统上(尤其是在UNIX编译器下),当前目录是包含#include指令的文件所
在的目录。
0 0
- 《你必须知道的495个C语言问题》笔记--C预处理器
- 《你必须知道的495个C语言问题》笔记--C预处理器
- 《你必须知道的495个C语言问题》 笔记
- 你必须知道的495个C语言问题 读书笔记
- 摘自【你必须知道的495个c语言问题】
- 《你必须知道的495个C语言问题》
- 你必须知道的495个C语言问题 读书笔记
- 你必须知道的495个C语言问题
- 《你必须知道的495个C语言问题》笔记--自己的
- 学习笔记_你必须知道的495个C语言问题
- 你必须知道的495个C语言问题-----学习笔记
- 《你必须知道的495个C语言问题》知识笔记及补充
- 《你必须知道的495个C语言问题》知识笔记及补充
- <你必须知道的495个C语言问题>学习笔记 (一)
- <你必须知道的495个C语言问题>学习笔记 (二 )完
- 《你必须知道的495个C语言问题》笔记--声明和初始化
- 《你必须知道的495个C语言问题》笔记--结构、联合和枚举
- 《你必须知道的495个C语言问题》笔记--表达式
- popStar3
- UIMenuController的基本使用
- 转自原文地址:IOS UIScrollview UIImageView点击事件处理
- 关于listview的研究(一)
- 调节UILabel的行间距
- 《你必须知道的495个C语言问题》笔记--C预处理器
- 1.1 broken neckless(一直想用O(N)复杂度的方法写,写了两天两个百多行的都跪了,还是乖乖用O(N^2)复杂度的方法写算了)
- jQuery对象转换为DOM对象
- 程序运行过程中数据的益出问题
- 游标的使用
- DropBoxManager简介
- 《你必须知道的495个C语言问题》笔记--标准输入输出
- maven自动化:部署项目到tomcat
- 《你必须知道的495个C语言问题》笔记--库函数