博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
读书笔记--C陷阱与缺陷(六)
阅读量:5045 次
发布时间:2019-06-12

本文共 943 字,大约阅读时间需要 3 分钟。

第六章

      1.预处理器:预处理器先对代码进行必要的转换处理,简化编程者的工作。

      它的重要原因有以下两点:

      a. 假如要将程序中出现的所有实例都加以修改,但希望只改动程序一处数值,重新编译实现。

      预处理器可以做到这点,通过将这个数值设为显式常量。

      b. C语言函数调用花销大,希望有一个程序块看上去像函数确没有函数调用的开销。

     

      2.宏定义的空格不能忽视

      宏定义只是简单的文本替换,记住这个本质可以避免很多错误。

      如: #define f  (x)  ((x)-1)

      上式意思是: f(x)代表((x)-1)    还是 f 代表(x)((x)-1)

      正确答案是后者。因为f与(x)之间多了空格;如果想表达前者的意思,应该定义为如下:

      #define f(x)  ((x)-1)

      括号也很重要,否则文本替换后运算会产生歧义。

1 //#define f1  (x)  ((x)-1) 2 #define f2(x)  ((x)-1) 3 #define f3(x)  (x)-1 4 int main() 5 { 6  7     int r1,r2,r3; 8     //r1=f1(10)*2; 9     r2=f2(10)*2;10     r3=f3(10)*2;11     printf("%d\n %d\n", r2, r3);12 13     return 0;14 }

   其实f1的定义是无法通过的,在编译中报错x未定义。

      输出:r2=18, r3=8;

      因为 r3=(10)-1*2;

      所以宏定义的参数最好都用括号括起来!宏调用时的参数不要出现自增自减运算!

     

      3.宏不是类型定义

      其实之前章节就说明过使用 typedef 声明类型要由于使用 define;

      如: 

  

#define T1 struct foo *    typedef struct foo *T2;    T1 a, b;    T2 c, d;

  a,c,d都可以成功的定义为指向结构的指针,但是b却是定义为结构,非指针。

      因为 #define struct foo *a, b; b缺少了*

转载于:https://www.cnblogs.com/chenzhefan/p/7517933.html

你可能感兴趣的文章
第三节
查看>>
oracle 数据库 date + 1 转载
查看>>
下载北斗广播星历
查看>>
Remote Desktop Connection没法全屏解决方案
查看>>
关于欧拉函数
查看>>
题目 子网掩码
查看>>
add, subtract, multiply, divide
查看>>
PHP结合MYSQL记录结果分页呈现(比较实用)
查看>>
Mysql支持的数据类型
查看>>
openSuse beginner
查看>>
Anaconda入门安装教程
查看>>
网络编程
查看>>
Linq学习(三)-基本查询
查看>>
input type="file"
查看>>
lnamp完整版[linux+apache2.4+php5.6.6+mysql5.6]
查看>>
Codeforces 620E(线段树+dfs序+状态压缩)
查看>>
Windows7中双击py文件运行程序
查看>>
Market entry case
查看>>
bzoj1230 开关灯 线段树
查看>>
LinearLayout
查看>>