黑马程序员——day02、c语言知识整合(三)
2014-04-30 04:07
141 查看
预处理指令
1.C语言在对源程序进行编译之前,会先对一些特殊的预处理指令作解释(比如之前使用的#include文件包含指令),产生一个新的源程序(这个过程称为编译预处理),之后再进行通常的编译
2.为了区分预处理指令和一般的C语句,所有预处理指令都以符号"#"开头,并且结尾不用分号
3.预处理指令可以出现在程序的任何位置,它的作用范围是从它出现的位置到文件尾。习惯上我们尽可能将预处理指令写在源程序开头,这种情况下,它的作用范围就是整个源程序文件
4.C语言提供的预处理指令主要有:宏定义、文件包含、条件编译
一、宏定义
宏定义可以分为2种:不带参数的宏定义 和 带参数的宏定义。
不带参数的宏定义
#define
宏名 字符串
比如#define ABC 10
右边的字符串也可以省略,比如#define ABC
它的作用是在编译预处理时,将源程序中所有"宏名"替换成右边的"字符串",常用来定义常量。
2> 对程序中用双引号扩起来的字符串内的字符,不进行宏的替换操作。
3> 在编译预处理用字符串替换宏名时,不作语法检查,只是简单的字符串替换。只有在编译的时候才对已经展开宏名的源程序进行语法检查
4> 宏名的有效范围是从定义位置到文件结束。如果需要终止宏定义的作用域,可以用#undef命令
5> 定义一个宏时可以引用已经定义的宏名
在编译预处理时,将源程序中所有宏名替换成字符串,并且将 字符串中的参数 用 宏名右边参数列表 中的参数替换
2>
带参数的宏在展开时,只作简单的字符和参数的替换,不进行任何计算操作。所以在定义宏时,一般用一个小括号括住字符串的参数。
下面定义一个宏D(a),作用是返回a的2倍数值:
如果定义宏的时候不用小括号括住参数
![](http://images.cnitblog.com/blog/497279/201303/19235531-e435f016fca2473e9b6a4309dabe6e87.png)
如果定义宏的时候用小括号括住参数,把上面改成:
注意右边的a是有括号的,将被替换成int b = 2*(3+4);,输出结果:
1.C语言在对源程序进行编译之前,会先对一些特殊的预处理指令作解释(比如之前使用的#include文件包含指令),产生一个新的源程序(这个过程称为编译预处理),之后再进行通常的编译
2.为了区分预处理指令和一般的C语句,所有预处理指令都以符号"#"开头,并且结尾不用分号
3.预处理指令可以出现在程序的任何位置,它的作用范围是从它出现的位置到文件尾。习惯上我们尽可能将预处理指令写在源程序开头,这种情况下,它的作用范围就是整个源程序文件
4.C语言提供的预处理指令主要有:宏定义、文件包含、条件编译
一、宏定义
宏定义可以分为2种:不带参数的宏定义 和 带参数的宏定义。
不带参数的宏定义
#define
宏名 字符串
比如#define ABC 10
右边的字符串也可以省略,比如#define ABC
它的作用是在编译预处理时,将源程序中所有"宏名"替换成右边的"字符串",常用来定义常量。
#include <stdio.h> // 源程序中所有的宏名PI在编译预处理的时候都会被3.14所代替 #define PI 3.14 // 根据圆的半径计radius算周长 float girth(float radius) { return 2 * PI *radius; } int main () { float g = girth(2); printf("周长为:%f", g); return 0; }
使用习惯与注意
1> 宏名一般用大写字母,以便与变量名区别开来,但用小写也没有语法错误2> 对程序中用双引号扩起来的字符串内的字符,不进行宏的替换操作。
3> 在编译预处理用字符串替换宏名时,不作语法检查,只是简单的字符串替换。只有在编译的时候才对已经展开宏名的源程序进行语法检查
4> 宏名的有效范围是从定义位置到文件结束。如果需要终止宏定义的作用域,可以用#undef命令
5> 定义一个宏时可以引用已经定义的宏名
#define R 3.0 #define PI 3.14 #define L 2*PI*R #define S PI*R*R
带参数的宏定义
#define 宏名(参数列表) 字符串在编译预处理时,将源程序中所有宏名替换成字符串,并且将 字符串中的参数 用 宏名右边参数列表 中的参数替换
使用注意
1> 宏名和参数列表之间不能有空格,否则空格后面的所有字符串都作为替换的字符串2>
带参数的宏在展开时,只作简单的字符和参数的替换,不进行任何计算操作。所以在定义宏时,一般用一个小括号括住字符串的参数。
下面定义一个宏D(a),作用是返回a的2倍数值:
如果定义宏的时候不用小括号括住参数
#include <stdio.h> #define D(a) 2*a int main () { int b = D(3+4); printf("%d", b); return 0; }被替换成int b = 2*3+4;,输出结果:
![](http://images.cnitblog.com/blog/497279/201303/19235531-e435f016fca2473e9b6a4309dabe6e87.png)
如果定义宏的时候用小括号括住参数,把上面改成:
#define D(a) 2*(a)
注意右边的a是有括号的,将被替换成int b = 2*(3+4);,输出结果:
![](http://images.cnitblog.com/blog/497279/201303/19235741-583de2c6bb3c440ba01f7d1583f7fc2a.png)
相关文章推荐
- 黑马程序员——day02、c语言知识整合(二)
- 黑马程序员——day01、c语言知识整合(一)
- 黑马程序员--Objective-C语言基础知识--特有语法
- 黑马程序员——java语言基础知识回顾(三)
- 黑马程序员——Objective-C语言知识整理——封装、继承与多态
- 黑马程序员——Java语言基础知识(二)
- 黑马程序员-day02java语言基础组成1
- 黑马程序员————C语言基础 第13篇 字符串知识总结
- 黑马程序员—OC语言基础—基础语法知识
- 黑马程序员---C语言知识总结(下)
- 黑马程序员-C语言基础知识-函数
- 黑马程序员——java基础知识回顾(二)(java语言基础组成)
- 黑马程序员——Objective-C语言知识整理——类方法与对象方法
- 黑马程序员---C语言知识总结(上)
- 黑马程序员_c语言基础知识大汇总
- 黑马程序员——C语言知识小节------初学者容易忽略的知识点
- 黑马程序员-继承的知识整合
- 黑马程序员——Java语言基础知识(一)
- 黑马程序员——Objective-C语言知识整理——匿名类与self/super关键字
- 黑马程序员-Java基础知识-day02